Jad*_*ias 278 python list generator
用linq我会的
var top5 = array.Take(5);
Run Code Online (Sandbox Code Playgroud)
如何用Python做到这一点?
lun*_*chs 446
top5 = array[:5]
Run Code Online (Sandbox Code Playgroud)
array[start:stop:step]
array[start:]
,array[:stop]
,array[::step]
import itertools
top5 = itertools.islice(my_list, 5) # grab the first five elements
Run Code Online (Sandbox Code Playgroud)
你不能直接在Python中切片生成器.itertools.islice()
将使用语法将对象包装在新的切片生成器中itertools.islice(generator, start, stop, step)
请记住,切割发电机会使其部分耗尽.如果你想保持整个生成器的完整性,可能先把它变成一个元组或列表,如:result = tuple(generator)
Jad*_*ias 108
import itertools
top5 = itertools.islice(array, 5)
Run Code Online (Sandbox Code Playgroud)
小智 33
根据我的喜好,将'zip()'与'xrange(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)
Run Code Online (Sandbox Code Playgroud)
Bed*_*des 24
@ 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))
小智 13
这里可以找到如何做到这一点的答案
>>> 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]
Run Code Online (Sandbox Code Playgroud)
请注意,当剩下的只有2个时,最后一个呼叫要求下一个4.使用list()
而不是[]
得到理解终止于StopIteration
抛出的异常next()
.
你的意思是前 N个项目,还是N个最大的项目?
如果你想要第一个:
top5 = sequence[:5]
Run Code Online (Sandbox Code Playgroud)
这也适用于最大的N项,假设您的序列按降序排序.(您的LINQ示例似乎也假设了这一点.)
如果你想要最大的,并且它没有排序,最明显的解决方案是首先对其进行排序:
l = list(sequence)
l.sort(reverse=True)
top5 = l[:5]
Run Code Online (Sandbox Code Playgroud)
要获得更高性能的解决方案,请使用min-heap(感谢Thijs):
import heapq
top5 = heapq.nlargest(5, sequence)
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
222818 次 |
最近记录: |