回答
切片列表
top5 = array[:5]
- 切片列表,有一个简单的语法:
array[start:stop:step]
- 您可以省略任何参数。这些都是有效的:
array[start:]
,array[:stop]
,array[::step]
切片发电机
import itertools
top5 = itertools.islice(my_list, 5) # grab the first five elements
你不能在Python直接切片发电机。
itertools.islice()
将使用语法将对象包装在新的切片生成器中使用语法itertools.islice(generator, start, stop, step)
请记住,切片生成器会部分耗尽它。如果你想保持整个发电机完好,也许把它变成一个元组或列表第一,如:
result = tuple(generator)
另请注意,'itertools.islice'将返回一个生成器。 – 2014-02-01 02:06:49
为什么你会变得复杂?只要扔'my_list [:5]',我们所有的生活现在简单 – OverCoder 2016-06-11 02:00:01
问题是“生成器或列表”。这些有两个不同的答案。 'islice'对列表来说是错误的答案,但对于一个生成器来说是正确的答案。我清理了一些答案,以便更清楚地说明问题。 – lunixbochs 2016-06-11 04:18:23
这应该工作
top5 = array[:5]
你的意思是第一 N项,或者N 最大项目?
如果你想第一:
top5 = sequence[:5]
这也适用于最大的N个项目,假设你的顺序降序排列。 (你的LINQ例子似乎承担这一以及)
如果你想最大的,它是没有排序,最明显的解决方案是先解决它:
l = list(sequence)
l.sort(reverse=True)
top5 = l[:5]
对于一个更好的性能解决方案,采用最小堆(感谢泰斯):
import heapq
top5 = heapq.nlargest(5, sequence)
不会先小吗? – 2011-03-08 15:32:36
呃,哎呀。将解决。 – Thomas 2011-03-08 21:57:53
+1用于回答,尽管问题明显含糊 – demongolem 2012-11-01 23:35:45
你必须使用切片:
试试这个:
>>> lst = [1,2,3,4,5]
>>> lst[:2]
[1, 2]
它从索引0到索引2
你也可以做这样的事情:
>>> lst = [1,2,3,4,5]
>>> lst[2:4]
[3, 4]
在我的口味,它也很简洁结合“拉链()”与“x范围(N )'(或Python3中的'range(n)'),这对于生成器也很好,并且对于一般的变化似乎更灵活。
# Option #1: taking the first n elements as a list
[x for _, x in zip(xrange(n), generator)]
# Option #2, using 'next()' and taking care for 'StopIteration'
[next(generator) for _ in xrange(n)]
# Option #3: taking the first n elements as a new generator
(x for _, x in zip(xrange(n), generator))
# Option #4: yielding them by simply preparing a function
# (but take care for 'StopIteration')
def top_n(n, generator):
for _ in xrange(n): yield next(generator)
itertools
随着你将得到另一个发生器对象,以便在大多数情况下将需要另一步骤中采取的第N个元素(N
)。有至少两个简单的解决方案(一点点效率较低的性能,但非常方便的术语),以准备好从generator
使用的元素:
使用列表理解:
first_N_element=[generator.next() for i in range(N)]
否则:
first_N_element=list(generator)[:N]
N
其中N
是你想要的元素的数量(例如前五个元素的N = 5)。
如何做到这一点的答案可以发现here
>>> generator = (i for i in xrange(10))
>>> list(next(generator) for _ in range(4))
[0, 1, 2, 3]
>>> list(next(generator) for _ in range(4))
[4, 5, 6, 7]
>>> list(next(generator) for _ in range(4))
[8, 9]
注意,最后一次通话要求下一个4时只有2个被剩下。 list()
而不是[]
的用法是理解终止于由next()
抛出的StopIteration
异常。
@ Shaikovsky的回答非常好,但我想澄清几点。
[next(generator) for _ in range(n)]
这是最简单的方法,但抛出StopIteration
如果发电机是过早地耗尽。
在另一方面,下面的方法恢复高达n
项目这无疑是最好在大多数情况下:
列表: [x for _, x in zip(range(n), records)]
发电机: (x for _, x in zip(range(n), records))
难道那些少数人下调这个答案,请解释为什么? – 2018-02-05 11:49:52
- 1. 如何从python列表中生成订单列表项目
- 2. 在Python中,如何获取列表中的第n个项目的值?
- 3. 如何从k个项目列表中生成所有n大小的集合?
- 4. 如何从Python中的两个列表中生成一个生成器?
- 5. 如何从Python中的生成器获取一个值?
- 6. Python:如何获取一个列表中的项目数量
- 7. 如何重新排序Python列表中的每N个项目
- 8. Python - 如何从列表中获取项目?
- 9. 如何从列表项中获取单个项目
- 10. 如何获取TFS中的生成项目定制生成activitiy
- 11. 从n的列表中生成灯具
- 12. 如何批量从项目列表中获取子项目?
- 13. Python:有什么办法从列表中获取多个项目?
- 14. 从队列中获取最后n个项目
- 15. 从另一个列表的ID获取列表中的项目
- 16. 如何从列表框中获取列表框项目wpf
- 17. 如何从SharePoint列表中获取超过5000个项目?
- 18. 如何从TFS获取项目列表?
- 19. 如何从无序列表中选择第n个项目?
- 20. 如何从发生器中挑选一个项目(在python中)?
- 21. 如何获得Java中队列中的第n个项目?
- 22. 如何在python列表中的东西后获取项目?
- 23. 如何从列表中获得项目
- 24. 函数从列表中获取项目
- 25. 从多个列表中生成随机条目的Python代码
- 26. python:如何获得列表生成器表达式中的列表长度?
- 27. Python:从列表中随机产生的项目只有两个
- 28. 生成词云在Python中列表中的项目
- 29. 在Python中生成一个长度为n的位列表
- 30. 从SelectList中获取N项
它混淆了这个问题被要求提供列表和生成器,这些应该是单独的q问题 – ThorSummoner 2017-05-23 17:24:12