制作一个新列表,包含原列表中的每第N个项目
假设我们有一个从0到1000的整数列表:
[0, 1, 2, 3, ..., 997, 998, 999]
我想要得到一个新的列表,这个列表里包含第一个数字和之后每隔10个数字的数字。
[0, 10, 20, 30, ..., 990]
我可以用一个循环来实现这个功能,但有没有更简洁的方法,甚至只用一行代码就能完成呢?
9 个回答
36
使用 range(start, end, step)
这个函数。
li = list(range(0, 1000, 10))
[0, 10, 20, 30, 40, 50, 60, 70, 80, 90 ... 990]
或者,如果你有一个列表,可以用切片:根据手册说明,s[i:j:k]
表示从列表 s 中,从位置 i 到位置 j,步长为 k 的一段。
yourlist = [0, ... ,10 ...]
sub = yourlist[::10] # same as yourlist[0:100:10]
>>> sub
[0, 10, 20, 30, 40, 50, 60, 70, 80, 90]
74
source_list[::10]
是最简单的方法,但这个方法并不适用于所有可迭代的对象,而且对于很大的列表来说,内存使用效率不高。itertools.islice(source_sequence, 0, None, 10)
适用于任何可迭代的对象,并且在内存使用上比较高效,但对于大列表和大步长来说,可能不是最快的解决方案。(source_list[i] for i in xrange(0, len(source_list), 10))
393
>>> xs = list(range(165))
>>> xs[0::10]
[0, 10, 20, 30, 40, 50, 60, 70, 80, 90, 100, 110, 120, 130, 140, 150, 160]
$ python -m timeit -s "xs = list(range(1000))" "[x for i, x in enumerate(xs) if i % 10 == 0]"
500 loops, best of 5: 476 usec per loop
$ python -m timeit -s "xs = list(range(1000))" "xs[0::10]"
100000 loops, best of 5: 3.32 usec per loop
请注意,这种方法比逐个循环检查每个元素的余数快大约100倍: