为了账号安全,请及时绑定邮箱和手机立即绑定

返回大列表中第n个项目的列表的Python方法

返回大列表中第n个项目的列表的Python方法

眼眸繁星 2019-11-26 15:21:07
假设我们有一个从0到1000的数字列表。是否有一种pythonic /高效的方法来生成第一个以及随后的第10个项目的列表,即[0, 10, 20, 30, ... ]?是的,我可以使用for循环来执行此操作,但是我想知道是否有更整洁的方法可以执行此操作,甚至在一行中也可以?
查看完整描述

3 回答

?
30秒到达战场

TA贡献1828条经验 获得超6个赞

>>> lst = list(range(165))

>>> lst[0::10]

[0, 10, 20, 30, 40, 50, 60, 70, 80, 90, 100, 110, 120, 130, 140, 150, 160]

请注意,这比循环并检查每个元素的模量快约100倍:


$ python -m timeit -s "lst = list(range(1000))" "lst1 = [x for x in lst if x % 10 == 0]"

1000 loops, best of 3: 525 usec per loop

$ python -m timeit -s "lst = list(range(1000))" "lst1 = lst[0::10]"

100000 loops, best of 3: 4.02 usec per loop


查看完整回答
反对 回复 2019-11-26
?
慕神8447489

TA贡献1780条经验 获得超1个赞

  1. source_list[::10] 是最明显的,但这对任何可迭代的方法都无效,并且对于大列表而言内存效率不高。

  2. itertools.islice(source_sequence, 0, None, 10) 适用于任何可迭代且内存有效的方法,但对于大型列表和大型步骤而言,可能不是最快的解决方案。

  3. (source_list[i] for i in xrange(0, len(source_list), 10))


查看完整回答
反对 回复 2019-11-26
?
12345678_0001

TA贡献1802条经验 获得超5个赞

为什么不只使用range函数的step参数来获得:


l = range(0, 1000, 10)

为了进行比较,在我的机器上:


H:\>python -m timeit -s "l = range(1000)" "l1 = [x for x in l if x % 10 == 0]"

10000 loops, best of 3: 90.8 usec per loop

H:\>python -m timeit -s "l = range(1000)" "l1 = l[0::10]"

1000000 loops, best of 3: 0.861 usec per loop

H:\>python -m timeit -s "l = range(0, 1000, 10)"

100000000 loops, best of 3: 0.0172 usec per loop


查看完整回答
反对 回复 2019-11-26
  • 3 回答
  • 0 关注
  • 674 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信