Frage

Was ist der beste Weg, um den letzten Artikel von einem Iterator in Python 2.6 zu bekommen? Zum Beispiel sagen

my_iter = iter(range(5))

Was ist der kürzeste Code / sauberste Weg, um zu bekommen? 4 aus my_iter?

Ich könnte das tun, aber es erscheint nicht sehr effizient:

[x for x in my_iter][-1]
War es hilfreich?

Lösung

Öffnen Sie das XSL Ihres Suchkernergebniss-Webparts und suchen Sie es für einen Microsoft-Kommentar: <!-- When empty result set is returned from search -->.Direkt unter dem Kommentar gibt es eine XSL-Vorlage, um die Nachricht anzuzeigen, wenn keine Ergebnisse gefunden werden. Möglicherweise finden Sie vielleicht den Standard-XSL für den Kernergebnis-Webpart im Internet oder nehmen Sie ihn einfach aus dem Kernergebnis-Webpart mit der Standardanpassung und vergleichen Sie ihn dannes mit dir.Oder Sie können Ihr eigenes HTML schreiben, um anzuzeigen, wenn keine Ergebnisse angezeigt werden, indem Sie alles in diese Vorlage ersetzen :)

Andere Tipps

Verwenden ein deque von Größe 1.

from collections import deque

#aa is an interator
aa = iter('apple')

dd = deque(aa, maxlen=1)
last_element = dd.pop()

Wenn Sie Python 3.x verwenden:

*_, last = iterator # for a better understanding check PEP 448
print(last)

Wenn Sie Python 2.7 verwenden:

last = next(iterator)
for last in iterator:
    continue
print last


NB:

Normalerweise ist die oben dargestellte Lösung das, was Sie für reguläre Fälle benötigen. Wenn Sie jedoch mit einer großen Datenmenge zu tun haben, ist es effizienter, a zu verwenden deque von Größe 1. ((Quelle)

from collections import deque

#aa is an interator
aa = iter('apple')

dd = deque(aa, maxlen=1)
last_element = dd.pop()

Wahrscheinlich benutzt es wert __reversed__ Wenn es verfügbar ist

if hasattr(my_iter,'__reversed__'):
    last = next(reversed(my_iter))
else:
    for last in my_iter:
        pass

So einfach wie:

max(enumerate(the_iter))[1]

Dies ist unwahrscheinlich

reduce(lambda x,y:y,my_iter)

Wenn der Iter leer ist, wird ein Typeerror angehoben

Da ist das

list( the_iter )[-1]

Wenn die Länge der Iteration wirklich episch ist - so lange, dass die Materialierung der Liste das Gedächtnis erschöpft -, müssen Sie das Design wirklich überdenken.

ich würde ... benutzen reversed, außer dass es nur Sequenzen statt Iteratoren erfordert, was eher willkürlich erscheint.

Wie auch immer Sie es tun, Sie müssen den gesamten Iterator durchlaufen. Wenn Sie den Iterator bei maximaler Effizienz nie wieder benötigen, können Sie einfach alle Werte abgeben:

for last in my_iter:
    pass
# last is now the last item

Ich denke, dies ist jedoch eine suboptimale Lösung.

Das Toolz Die Bibliothek bietet eine schöne Lösung:

from toolz.itertoolz import last
last(values)

Das Hinzufügen einer Nicht-Kern-Abhängigkeit lohnt sich jedoch möglicherweise nicht, sie nur in diesem Fall zu verwenden.

Sehen Sie diesen Code für etwas Ähnliches:

http://excamera.com/sphinx/article-islast.html

Sie können es verwenden, um den letzten Artikel mit:

[(last, e) for (last, e) in islast(the_iter) if last]

Ich würde einfach benutzen next(reversed(myiter))

Es geht darum, das letzte Element eines Iterators zu erhalten. Wenn Ihr Iterator jedoch durch Anwenden von Bedingungen auf eine Sequenz erstellt wird, kann umgekehrt werden, um das "erste" einer umgekehrten Sequenz zu finden, die nur die erforderlichen Elemente betrachtet, indem sie sich anwenden Rückwärts in die Sequenz selbst.

Ein erfundenes Beispiel,

>>> seq = list(range(10))
>>> last_even = next(_ for _ in reversed(seq) if _ % 2 == 0)
>>> last_even
8

Alternativ für unendliche Iteratoren können Sie verwenden:

from itertools import islice 
last = list(islice(iterator(), 1000))[-1] # where 1000 is number of samples 

Ich dachte, es wäre dann langsamer deque Aber es ist so schnell und es ist tatsächlich schneller als für die Loop -Methode (irgendwie)

Die Frage ist falsch und kann nur zu einer Antwort führen, die kompliziert und ineffizient ist. Um einen Iterator zu erhalten, beginnen Sie natürlich von etwas, das iterbar ist, was in den meisten Fällen eine direktere Möglichkeit für den Zugriff auf das letzte Element bietet.

Sobald Sie einen Iterator von einem iterablen erstellt haben, gehen Sie in den Elementen, da dies das einzige ist, was ein Iterable bietet.

Der effizienteste und klarste Weg ist es also nicht, den Iterator überhaupt nicht zu erstellen, sondern die nativen Zugriffsmethoden des Iterablen zu verwenden.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top