Ich suche nach einem Äquivalent in Python dictionary.get(key, default)
für Listen. Gibt es eine Liner-Sprache, um das n-te Element einer Liste oder einen Standardwert abzurufen, falls dieser nicht verfügbar ist?
Zum Beispiel, wenn ich eine Liste myList erhalten möchte myList[0]
, oder 5, wenn myList
es sich um eine leere Liste handelt.
Vielen Dank.
index == -1000000
sollte zurückkehrendefault
.x[index] if 0 <= index < len(x) else default
wäre besser wennindex
jemals negativ sein kann.valid_index()
ist falsch. Negative Indizes sind in Python legal - das sollte auch so sein-len(l) <= index < len(l)
.Bearbeiten: Ich habe die Prüfung für TypeError entfernt - wahrscheinlich besser, damit der Anrufer damit umgehen kann.
quelle
Dies ist wahrscheinlich besser, wenn es
a
größer wirdDies funktioniert, weil if
a[n:]
eine leere Liste ist, wennn => len(a)
Hier ist ein Beispiel, wie dies funktioniert
range(5)
Und der volle Ausdruck
quelle
next(iter(lst[i:i+1]), default)
- nur ein weiterer Eintrag im kryptisch hässlichen Einzeiler-Wettbewerb.Habe gerade das entdeckt:
iter(l)
Gibt einen Iterator zurückmyList
,next()
verbraucht das erste Element des Iterators und löst einenStopIteration
Fehler aus, außer wenn er mit einem Standardwert aufgerufen wird, was hier der Fall ist, das zweite Argument.5
Dies funktioniert nur, wenn Sie das 1. Element möchten, was in Ihrem Beispiel der Fall ist, aber nicht im Text Ihrer Frage, also ...
Außerdem müssen keine temporären Listen im Speicher erstellt werden, und es funktioniert für jede Art von iterierbaren Listen, auch wenn es keinen Namen hat (siehe Xiong Chiamiovs Kommentar zu gruszczys Antwort).
quelle
next(iter(myList[n:n+1]), 5)
Jetzt funktioniert es für dasn
th-Element.try
Variante ist kein Einzeiler (fragen Sie nach OP). Es funktioniert nur für Listen, damyList
es sich um eine von OP angegebene Liste handelt (um genau zu sein, es ist etwas Indizierbares). Das Erstellen einer Kopie im Speicher ist hier nicht teuer, da ich hier eine Liste mit einem einzelnen (oder keinem) Element erstelle. Sicher, ein wenig Aufwand, aber nicht erwähnenswert, es sei denn, Sie tun dies millionenfach in einer Schleife. Übrigens denke ich, dass das Erstellen und Abfangen einerIndexError
Ausnahme wahrscheinlich teurer ist.quelle
[] or ...
habe. Ich persönlich würde jedoch nur die akzeptierte Lösung verwenden, da sie leicht zu lesen ist (für Anfänger). Zugegeben, wenn man es mit einem 'def' in einen Kommentar einwickelt, ist das größtenteils kein Problem.L[n] == False
oderL[n] == None
oderL[n] == []
global etwas, das als falsch bewertet wird?[False]
ist wahr.myval = l[n:n+1] or [somedefault]
würde gut funktionieren?Es gibt ein itertools-Rezept , das dies für allgemeine iterables tut. Der Einfachheit halber können Sie
> pip install more_itertools
diese Drittanbieter-Bibliothek importieren, die solche Rezepte für Sie implementiert:Code
Detail
Hier ist die Umsetzung des
nth
Rezepts:Mögen
dict.get()
, gibt dieses Tool eine Standard für fehlende Indizes. Es gilt für allgemeine iterables:quelle
Eine billige Lösung ist es, wirklich ein Diktat mit Aufzählung zu machen und
.get()
wie gewohnt zu verwenden, wiequelle
Wenn Sie @ Joachim's mit dem oben genannten kombinieren, können Sie es verwenden
Beispiele:
Oder vielleicht klarer, aber ohne die
len
quelle
Verwenden Sie Python 3.4
contextlib.suppress(exceptions)
, um einegetitem()
ähnliche Methode wie zu erstellengetattr()
.quelle