455 Stimmen

Wie entnehme ich die ersten N Einträge aus einem Generator oder einer Liste?

Mit linq Ich würde

var top5 = array.Take(5);

Wie macht man das mit Python?

739voto

lunixbochs Punkte 20277

Zerschneiden einer Liste

top5 = array[:5]
  • Um eine Liste zu zerschneiden, gibt es eine einfache Syntax: array[start:stop:step]
  • Sie können jeden Parameter weglassen. Diese sind alle gültig: array[start:] , array[:stop] , array[::step]

Schneiden eines Generators

import itertools
top5 = itertools.islice(my_list, 5) # grab the first five elements
  • Sie können einen Generator nicht direkt in Python zerschneiden. itertools.islice() verpackt ein Objekt in einen neuen Slicing-Generator mit der Syntax itertools.islice(generator, start, stop, step)

  • Denken Sie daran, dass ein Generator durch Aufschneiden teilweise erschöpft wird. Wenn Sie den gesamten Generator intakt lassen wollen, wandeln Sie ihn vielleicht zuerst in ein Tupel oder eine Liste um, etwa so: result = tuple(generator)

155voto

Jader Dias Punkte 84120
import itertools

top5 = itertools.islice(array, 5)

71voto

@Shaikovskys Antwort ist ausgezeichnet, aber ich wollte einige Punkte klarstellen.

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

Dies ist der einfachste Ansatz, wirft aber StopIteration wenn der Generator vorzeitig erschöpft ist.


Auf der anderen Seite ergeben die folgenden Ansätze bis zu n was unter vielen Umständen vorzuziehen ist:

Liste: [x for _, x in zip(range(n), records)]

Generator: (x for _, x in zip(range(n), records))

52voto

Shaikovsky Punkte 486

Für meinen Geschmack ist es auch sehr prägnant, die zip() con xrange(n) (oder range(n) in Python3), was auch bei Generatoren gut funktioniert und generell flexibler für Änderungen zu sein scheint.

# 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)

22voto

ebergerson Punkte 349

Die Antwort auf die Frage, wie man das macht, finden Sie aquí

>>> 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]

Beachten Sie, dass der letzte Aufruf nach den nächsten 4 fragt, obwohl nur noch 2 übrig sind. Die Verwendung der list() 代わりに [] bewirkt, dass das Verständnis auf der StopIteration Ausnahme, die ausgelöst wird durch next() .

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X