Pythonic方式返回更大列表中每个第n项的列表

p.b*_*own 149 python list

假设我们有一个从0到1000的数字列表.是否有一种pythonic /有效的方法来生成第一个和后续第10个项目的列表,即[0, 10, 20, 30, ... ]

是的,我可以使用for循环执行此操作,但我想知道是否有更简洁的方法来执行此操作,甚至可能在一行中?

Ned*_*ily 252

>>> lst = list(range(165))
>>> lst[0::10]
[0, 10, 20, 30, 40, 50, 60, 70, 80, 90, 100, 110, 120, 130, 140, 150, 160]
Run Code Online (Sandbox Code Playgroud)

编辑:只是为了好玩,一点时间比较(忽略边界条件):

$ 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
Run Code Online (Sandbox Code Playgroud)

  • @Andre:非常真实.所以这是一个简洁的语言特征的例子,切片操作符,在这种情况下(1),以便更容易得到正确的结果; (2)表达更简洁; (3)恰好快2个数量级.(1)当然是迄今为止最重要的问题,但是,由于语言的精心设计和实施,你得到了所有三个以1的价格.好的问题和答案. (12认同)
  • `l[0::10]` 中的 `0` 是多余的。`l[::10]` 更具可读性,更少混淆。 (8认同)
  • 当然,列表推导一般来说更强大.OTOH,这个问题假定了一个现有的列表,在这种情况下,一个切片工作得很好. (4认同)
  • 您的比较不合适,因为您选择的是可被 10 整除的每个元素,而不是选择每 10 个元素。将切片符号与此进行比较会更合适:`lst = list(range(1000)); lst1 = [lst[i] for i in range(0, len(lst), 10)]`。在我的机器上,对于切片表示法,我得到“1000000 个循环,最好的 5 个:每个循环 395 纳秒”,对于列表理解,我得到“20000 个循环,最好的 5 个循环:每个循环 11.1 usec”。 (2认同)

Den*_*ach 47

  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))


Nic*_*kis 23

您可以像这样使用切片运算符:

l = [1,2,3,4,5]
l2 = l[::2] # get subsequent 2nd item
Run Code Online (Sandbox Code Playgroud)

  • @ user1993`L [2 :: 2]` (4认同)
  • 如何从第三项开始获取第二项? (3认同)

tue*_*ist 15

来自手册: s[i:j:k] slice of s from i to j with step k

li = range(100)
sub = li[0::10]

>>> sub
[0, 10, 20, 30, 40, 50, 60, 70, 80, 90]
Run Code Online (Sandbox Code Playgroud)


Dav*_*d Z 11

newlist = oldlist[::10]
Run Code Online (Sandbox Code Playgroud)

这将挑选出列表中的每个第10个元素.