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

时间:2009-09-10 06:32:29

标签: list python

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

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

9 个答案:

答案 0 :(得分:238)

>>> l = range(165)
>>> l[0::10]
[0, 10, 20, 30, 40, 50, 60, 70, 80, 90, 100, 110, 120, 130, 140, 150, 160]

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

$ python -m timeit -s "l = range(1000)" "l1 = [x for x in l if x % 10 == 0]"
1000 loops, best of 3: 525 usec per loop
$ python -m timeit -s "l = range(1000)" "l1 = l[0::10]"
100000 loops, best of 3: 4.02 usec per loop

答案 1 :(得分:46)

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

答案 2 :(得分:22)

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

l = [1,2,3,4,5]
l2 = l[::2] # get subsequent 2nd item

答案 3 :(得分: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]

答案 4 :(得分:12)

newlist = oldlist[::10]

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

答案 5 :(得分:3)

为什么不使用范围功能的步骤参数来获取:

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

答案 6 :(得分:2)

existing_list = range(0, 1001)
filtered_list = [i for i in existing_list if i % 10 == 0]

答案 7 :(得分:1)

以下是“每第10项”列表理解的更好实现,它不会将列表内容用作成员资格测试的一部分:

>>> l = range(165)
>>> [ item for i,item in enumerate(l) if i%10==0 ]
[0, 10, 20, 30, 40, 50, 60, 70, 80, 90, 100, 110, 120, 130, 140, 150, 160]
>>> l = list("ABCDEFGHIJKLMNOPQRSTUVWXYZ")
>>> [ item for i,item in enumerate(l) if i%10==0 ]
['A', 'K', 'U']

但这仍然比使用列表切片慢得多。

答案 8 :(得分:-8)

列表理解正是为此做出的:

smaller_list = [x for x in range(100001) if x % 10 == 0]

您可以在python官方文档中获得有关它们的更多信息: http://docs.python.org/tutorial/datastructures.html#list-comprehensions