问题:返回较大列表中第n个项目的列表的Python方法
假设我们有一个从0到1000的数字列表。是否有一种pythonic /高效的方法来生成第一个以及随后的第10个项目的列表,即[0, 10, 20, 30, ... ]
?
是的,我可以使用for循环来执行此操作,但是我想知道是否有更整洁的方法可以执行此操作,甚至在一行中也可以?
回答 0
>>> lst = list(range(165))
>>> lst[0::10]
[0, 10, 20, 30, 40, 50, 60, 70, 80, 90, 100, 110, 120, 130, 140, 150, 160]
请注意,这比循环并检查每个元素的模量快约100倍:
$ 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
回答 1
source_list[::10]
是最明显的,但这对任何可迭代的方法都无效,并且对于大列表而言内存效率不高。itertools.islice(source_sequence, 0, None, 10)
适用于任何可迭代且内存有效的方法,但对于大型列表和大型步骤而言,可能不是最快的解决方案。(source_list[i] for i in xrange(0, len(source_list), 10))
回答 2
您可以像这样使用slice运算符:
l = [1,2,3,4,5]
l2 = l[::2] # get subsequent 2nd item
回答 3
从手册: 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
newlist = oldlist[::10]
这将选择列表中的第10个元素。
回答 5
为什么不只使用range函数的step参数来获得:
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
existing_list = range(0, 1001)
filtered_list = [i for i in existing_list if i % 10 == 0]
回答 7
这是“每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
列表理解正是为此而做出的:
smaller_list = [x for x in range(100001) if x % 10 == 0]
您可以在python官方文档中获取有关它们的更多信息:http : //docs.python.org/tutorial/datastructures.html#list-comprehensions
声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。