Sauberste Möglichkeit, den letzten Artikel von Python Iterator zu erhalten
-
22-09-2019 - |
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]
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.