如果是linq,我会

var top5 = array.Take(5);

如何用Python做到这一点?


当前回答

切片列表

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(发电机,启动,停止,步进) 记住,切割发电机会部分耗尽它。如果你想保持整个生成器的完整性,也许可以先将其转换为元组或列表,例如:

其他回答

import itertools

top5 = itertools.islice(array, 5)

@Shaikovsky的回答很好,但我想澄清两点。

[next(generator) for _ in range(n)]

这是最简单的方法,但如果生成器过早耗尽,则抛出StopIteration。


另一方面,以下方法最多返回n个项,这在许多情况下是可取的:

列表: [x for _, x in zip(范围(n),记录)]

发电机: (x for _, x in zip(range(n), records))

切片列表

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(发电机,启动,停止,步进) 记住,切割发电机会部分耗尽它。如果你想保持整个生成器的完整性,也许可以先将其转换为元组或列表,例如:

这应该可以

top5 = array[:5] 

如何做到这一点的答案可以在这里找到

>>> 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异常上终止。