创建一个新列表,其中包含原始列表中的每第 N 个项目
- 2025-02-07 08:44:00
- admin 原创
- 98
问题描述:
假设我们有一个从 0 到 1000 的整数列表:
[0, 1, 2, 3, ..., 997, 998, 999]
如何获取包含第一个项目和随后每个第 10 个项目的新列表?
[0, 10, 20, 30, ..., 990]
我可以使用 for 循环来做到这一点,但有没有更简洁的方法,甚至只用一行代码?
解决方案 1:
>>> xs = list(range(165))
>>> xs[0::10]
[0, 10, 20, 30, 40, 50, 60, 70, 80, 90, 100, 110, 120, 130, 140, 150, 160]
请注意,这比循环并检查每个元素的模量快 100 倍左右:
$ 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
解决方案 2:
source_list[::10]
是最明显的,但它不适用于任何可迭代对象,并且对于大型列表来说内存效率不高。itertools.islice(source_sequence, 0, None, 10)
适用于任何可迭代对象并且节省内存,但对于大列表和大步骤来说可能不是最快的解决方案。(source_list[i] for i in xrange(0, len(source_list), 10))
解决方案 3:
使用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] slice of s from i to j with step k
yourlist = [0, ... ,10 ...]
sub = yourlist[::10] # same as yourlist[0:100:10]
>>> sub
[0, 10, 20, 30, 40, 50, 60, 70, 80, 90]
解决方案 4:
您可以像这样使用切片运算符:
l = [1,2,3,4,5]
l2 = l[::2] # get subsequent 2nd item
解决方案 5:
newlist = oldlist[::10]
这将挑选出列表中的每 10 个元素。
解决方案 6:
为什么不直接使用范围函数的步进参数来获得:
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
解决方案 7:
existing_list = range(0, 1001)
filtered_list = [i for i in existing_list if i % 10 == 0]
解决方案 8:
这里有一个“每 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']
但这仍然比仅使用列表切片慢得多。
解决方案 9:
列表推导正是为此而设计的:
smaller_list = [x for x in range(100001) if x % 10 == 0]
您可以在 Python 官方文档中获得有关它们的更多信息:
http ://docs.python.org/tutorial/datastructures.html#list-comprehensions
相关推荐
热门文章
项目管理软件有哪些?
热门标签
曾咪二维码
扫码咨询,免费领取项目管理大礼包!
云禅道AD