460 votes

Comment prendre les premiers éléments de N dans un générateur ou une liste en Python ?

Je le ferais avec LINQ

Comment faire avec Python ?

748voto

lunixbochs Points 7475

Vous ne pouvez pas couper un générateur directement en python. Vous pouvez utiliser itertools.islice() comme une fonction d'aide pour le faire. itertools.islice(generator, start, stop, step) Rappelez-vous, le découpage d'un générateur de gaz d'échappement partiellement. Si vous souhaitez conserver l'ensemble de générateur intacte, peut-être de le transformer en un tuple ou une liste premier: result = tuple(generator)

Pour une liste normale, vous pouvez simplement utiliser régulière de découpage. my_list[start:stop:step] Vous pouvez omettre "l'étape", ou démarrer/arrêter dans l'une de ces tranches d'implémentations.

 my_list[:5] # grab the first five elements
 my_list[-5:] # grab the last five elements
           # (negative list indices start from the right side)

 import itertools
 itertools.islice(my_list, 0, 5) # grab the first five elements

156voto

Jader Dias Points 23461
import itertools

top5 = itertools.islice(array, 5)

52voto

MARSHALL X Points 1

À mon goût, il est également très concis d’associer zip() à range(n), qui fonctionne gentil sur les générateurs aussi bien et semble être plus souples pour les changements en général.

Dans Python 3, tant zip() que range() sont des générateurs. Python 2, vous pouvez toujours rapporter les meilleurs éléments pour créer un générateur.

10voto

Thomas Points 63635

Entendez-vous le premier N éléments, ou les N plus grands éléments?

Si vous souhaitez que la première:

top5 = iterable[:5]

Cela fonctionne aussi pour le plus grand N éléments, en supposant que votre itérable est triée dans l'ordre décroissant. (Votre LINQ exemple semble assumer cette).

Si vous voulez la plus grande, et il n'est pas triée, la solution la plus évidente consiste à les trier d'abord:

l = list(iterable)
l.sort(reverse=True)
top5 = l[:5]

Pour un plus performant solution, utiliser un min-tas (merci Thijs):

import heapq
top5 = heapq.nlargest(5, iterable)

0voto

ssoler Points 923

Vous devez utiliser les tranches :

Essayez ceci :

Il faut partir d’index 0 à l’index 2.

Vous pouvez aussi faire des choses comme :

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X