制作一个新列表,包含原列表中的每第N个项目

238 投票
9 回答
355258 浏览
提问于 2025-04-15 14:12

假设我们有一个从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
  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))
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倍:

撰写回答