假设我们有一个从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)
Den*_*ach 47
source_list[::10] 是最明显的,但这对任何可迭代都不起作用,对于大型列表而言不是内存效率.itertools.islice(source_sequence, 0, None, 10) 适用于任何可迭代的并且是高效的,但可能不是大型列表和大步骤的最快解决方案.(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)
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)
| 归档时间: |
|
| 查看次数: |
176490 次 |
| 最近记录: |