Python-Sprache für die Rückgabe des ersten Elements oder Keine

271

Ich bin sicher, es gibt einen einfacheren Weg, der mir einfach nicht einfällt.

Ich rufe eine Reihe von Methoden auf, die eine Liste zurückgeben. Die Liste ist möglicherweise leer. Wenn die Liste nicht leer ist, möchte ich das erste Element zurückgeben. Andernfalls möchte ich None zurückgeben. Dieser Code funktioniert:

my_list = get_list()
if len(my_list) > 0: return my_list[0]
return None

Es scheint mir, dass es eine einfache einzeilige Redewendung dafür geben sollte, aber für mein Leben kann ich nicht daran denken. Gibt es?

Bearbeiten:

Der Grund, warum ich hier nach einem einzeiligen Ausdruck suche, ist nicht, dass ich unglaublich knappen Code mag, sondern dass ich so viel Code schreiben muss:

x = get_first_list()
if x:
    # do something with x[0]
    # inevitably forget the [0] part, and have a bug to fix
y = get_second_list()
if y:
    # do something with y[0]
    # inevitably forget the [0] part AGAIN, and have another bug to fix

Was ich gerne tun würde, kann sicherlich mit einer Funktion erreicht werden (und wird es wahrscheinlich auch sein):

def first_item(list_or_none):
    if list_or_none: return list_or_none[0]

x = first_item(get_first_list())
if x:
    # do something with x
y = first_item(get_second_list())
if y:
    # do something with y

Ich habe die Frage gestellt, weil ich häufig überrascht bin, was einfache Ausdrücke in Python bewirken können, und ich dachte, dass das Schreiben einer Funktion eine dumme Sache ist, wenn es einen einfachen Ausdruck gibt, der den Trick macht. Aber diese Antworten zu sehen, wie es scheint , eine Funktion ist die einfache Lösung.

Robert Rossney
quelle
28
Übrigens könnten Sie unter Python 2.6+ verwenden, next(iter(your_list), None)anstatt davon first_item(your_list)auszugehen, dass dies your_listnicht der Fall ist None( get_first_list()und get_second_list()müssen immer eine iterierbare Datei zurückgeben).
JFS
1
Ich denke, Sie meinen next(iter(your_list)), denn wenn Sie ein zweites Argument iterangeben, sagen Sie, dass das erste Argument aufrufbar ist.
Robert Rossney
7
Nein, Nonehier ist der zweite Parameter für next(), nicht iter(). next()Gibt den zweiten Parameter zurück, wenn er angegeben ist, anstatt ihn zu erhöhen, StopIterationwenn er your_listleer ist.
JFS
Die von @JFSebastian vorgeschlagene Lösung besteht aus einer doppelten Frage: stackoverflow.com/a/18533669/144408
shahjapan

Antworten:

204

Python 2.6+

next(iter(your_list), None)

Wenn your_listkann sein None:

next(iter(your_list or []), None)

Python 2.4

def get_first(iterable, default=None):
    if iterable:
        for item in iterable:
            return item
    return default

Beispiel:

x = get_first(get_first_list())
if x:
    ...
y = get_first(get_second_list())
if y:
    ...

Eine andere Möglichkeit besteht darin, die obige Funktion zu integrieren:

for x in get_first_list() or []:
    # process x
    break # process at most one item
for y in get_second_list() or []:
    # process y
    break

Um dies zu vermeiden break, könnten Sie schreiben:

for x in yield_first(get_first_list()):
    x # process x
for y in yield_first(get_second_list()):
    y # process y

Wo:

def yield_first(iterable):
    for item in iterable or []:
        yield item
        return
jfs
quelle
1
Diese letzte Option ist fast genau das, wonach ich suche: Es ist klar, es funktioniert und ich muss keine neue Funktion definieren. Ich würde "genau" sagen, wenn die Pause irgendwie nicht benötigt würde, weil das Risiko, sie wegzulassen, nicht unerheblich ist. Aber dieser Ansatz hat den Ring der Wahrheit.
Robert Rossney
Oh, das gefällt mir überhaupt nicht. Wenn ein Element in der Liste False ergibt, wird dieser Wert verworfen und ersetzt. Wenn Sie eine leere Zeichenfolge ""in der Liste haben, wird diese verworfen und durch eine leere Liste ersetzt []. Wenn Sie eine 0 haben, wird diese auch durch ersetzt []. Wenn Sie Falsedort drin haben , auch ersetzt. In einem bestimmten Fall könnten Sie damit durchkommen, aber es ist eine schlechte Angewohnheit, sich zu entwickeln.
Steveha
4
@steveha: bool(lst) sagt uns, ob len(lst) > 0es uns nichts darüber sagt, was Elemente lstenthalten, z. B. bool([False]) == True;der Ausdruck wird [False] or []zurückgegeben [False], das gleiche gilt für die [0] or [] Rückgabe [0].
JFS
@ RobertRossney: Ich habe hinzugefügt yield_first(), um breakAussage zu vermeiden .
JFS
1
@ ThomasAhle: beide sind wahr. Ich habe die Antwort aktualisiert, um die Lösung für Nicht-Keine-Fälle bereitzustellen.
JFS
217

Der beste Weg ist folgender:

a = get_list()
return a[0] if a else None

Sie können es auch in einer Zeile tun, aber für den Programmierer ist es viel schwieriger zu lesen:

return (get_list()[:1] or [None])[0]
efotinis
quelle
Hoppla. Sollte erwähnt haben, dass dies eine Python 2.4-App ist.
Robert Rossney
15
@ Adam: die Zukunft kann verwendennext(iter(your_list), None)
jfs
@JFSebastian ist eigentlich next(iter(your_list))ausreichend
Brad Johnson
13
@BradleagheJohnson: falsch. Es löst StopIteration aus, anstatt auf NoneOP- Aufforderung zurückzukehren . Versuchen Sie : next(iter([])).
JFS
72
(get_list() or [None])[0]

Das sollte funktionieren.

Übrigens habe ich die Variable nicht verwendet list, da dies die eingebaute list()Funktion überschreibt .

Edit: Ich hatte hier früher eine etwas einfachere, aber falsche Version.

rekursiv
quelle
4
Das ist klug und funktioniert, aber ich denke, "return foo [0] if foo else None", wie von efotinis vorgeschlagen, ist für die Wartung etwas einfacher zu befolgen.
Jay
3
Die Frage war nach einer einzeiligen Lösung, also habe ich das ausgeschlossen.
rekursiv
Keiner dieser Ausdrücke funktioniert, wenn get_list () None zurückgibt. Sie erhalten "TypeError: 'NoneType'-Objekt ist nicht abonnierbar." oder "TypeError: Nicht unterstützte Operandentypen für +: 'NoneType' und 'list'."
Robert Rossney
4
In der Frage heißt es, dass die Methoden Listen zurückgeben, von denen None keine ist. Angesichts der Anforderungen glaube ich immer noch, dass beide funktionieren.
rekursiv
Sollte jetzt funktionieren, wenn get_list () None zurückgibt, da es nicht mehr tiefgestellt oder hinzugefügt wird.
Robert
32

Die pythonischste Art ist die Verwendung von next () für einen Iterator, da die Liste iterierbar ist . Genau wie das, was @JFSebastian am 13. Dezember 2011 in den Kommentar aufgenommen hat.

next(iter(the_list), None)Dies gibt None zurück, wenn the_listes leer ist. siehe next () Python 2.6+

oder wenn Sie sicher wissen, the_listist nicht leer:

iter(the_list).next()siehe iterator.next () Python 2.2+

Devy
quelle
1
Dies hat den Vorteil, dass Sie Ihre Liste nicht einer Variablen zuweisen müssen, wie return l[0] if l else Nonez. B. wenn die Liste eine libcomp war. Wenn die Liste tatsächlich ein Genexpr ist, ist dies sogar noch besser, da Sie nicht die gesamte Liste wie innext(iter(x for x in range(10) if x % 2 == 0), None)
RubenLaguna erstellen müssen
Wenn Sie sicher wissen, dass the_listes nicht leer ist, würden Sie schreiben the_list[0].
Kaya3
12

Wenn Sie versuchen, das Erste (oder Keine) aus einem Listenverständnis herauszuholen, können Sie zu einem Generator wechseln, um Folgendes zu tun:

next((x for x in blah if cond), None)

Pro: Funktioniert, wenn bla nicht indizierbar ist. Con: Es ist eine ungewohnte Syntax. Es ist jedoch nützlich, wenn Sie in ipython herumhacken und Dinge filtern.

Aidan Kane
quelle
11

Die Lösung des OP ist fast da, es gibt nur ein paar Dinge, die es pythonischer machen.

Zum einen ist es nicht erforderlich, die Länge der Liste zu ermitteln. Leere Listen in Python werden bei einer if-Prüfung als falsch ausgewertet. Sag es einfach

if list:

Darüber hinaus ist es eine sehr schlechte Idee, Variablen zuzuweisen, die sich mit reservierten Wörtern überschneiden. "Liste" ist ein reserviertes Wort in Python.

Ändern wir das also in

some_list = get_list()
if some_list:

Ein wirklich wichtiger Punkt, den viele Lösungen hier übersehen, ist, dass alle Python-Funktionen / -Methoden standardmäßig None zurückgeben . Versuchen Sie Folgendes unten.

def does_nothing():
    pass

foo = does_nothing()
print foo

Sofern Sie None nicht zurückgeben müssen, um eine Funktion vorzeitig zu beenden, ist es nicht erforderlich, None explizit zurückzugeben. Kurz gesagt, geben Sie einfach den ersten Eintrag zurück, falls vorhanden.

some_list = get_list()
if some_list:
    return list[0]

Und schließlich wurde dies vielleicht impliziert, aber nur um explizit zu sein (weil explizit besser als implizit ist ), sollte Ihre Funktion die Liste nicht von einer anderen Funktion abrufen. Übergeben Sie es einfach als Parameter. Das Endergebnis wäre also

def get_first_item(some_list): 
    if some_list:
        return list[0]

my_list = get_list()
first_item = get_first_item(my_list)

Wie gesagt, das OP war fast da und nur ein paar Berührungen verleihen ihm den Python-Geschmack, den Sie suchen.

gotgenes
quelle
1
Warum ist 'list' ein reserviertes Wort in Python? Oder, genauer gesagt, wo steht, dass 'list' ein Reserver-Wort in Python ist? Oder, genauer gesagt, wie haben Sie überprüft, dass 'Liste' ein reserviertes Wort in Python ist? Wenn man bedenkt, dass ich eine Variable mit dem Namen 'list' deklarieren kann, ist dies eindeutig kein reserviertes Wort.
Lasse V. Karlsen
2
Punkt genommen. Die wirklich reservierten Wörter in Python finden Sie hier tinyurl.com/424663 . Es ist jedoch eine gute Idee, integrierte Funktionen und Typen als reserviert zu betrachten. list () generiert tatsächlich eine Liste. Gleiches gilt für Diktat, Reichweite usw.
Gotgenes
Ich würde die letzten beiden Zeilen kombinieren und die temporäre Variable entfernen (es sei denn, Sie benötigen my_list weiter). Das verbessert die Lesbarkeit.
Svante
Dies ist so ziemlich die Antwort, auf die ich mich hingezogen fühlte.
Robert Rossney
1
get_first_itemsollte einen defaultParameter (wie dict.get) akzeptieren, der standardmäßig None ist. Somit kommuniziert die Funktionsschnittstelle explizit, was passiert, wenn sie my_listleer ist.
JFS
3
for item in get_list():
    return item
A. Coady
quelle
Das ist prägnant und schön.
Gotgenes
Tragischerweise funktioniert es nicht; Es wird eine Ausnahme "TypeError: 'NoneType' Objekt ist nicht iterierbar" ausgelöst, wenn get_list () None zurückgibt.
Robert Rossney
So beheben Sie: "für Element in get_list () oder []:"
itsadok
5
Die Frage setzt eindeutig voraus, dass get_list eine Liste zurückgibt. len und getitem werden nach dem Ergebnis aufgerufen.
A. Coady
2

Ehrlich gesagt glaube ich nicht, dass es eine bessere Redewendung gibt: Ihre ist klar und knapp - Sie brauchen nichts "Besseres". Vielleicht, aber das ist wirklich eine Frage des Geschmacks ist, könnten Sie verändern if len(list) > 0:mitif list: - einer leeren Liste wird immer auf False auswerten.

In einem ähnlichen Zusammenhang ist Python nicht Perl (kein Wortspiel beabsichtigt!), Sie müssen nicht den coolsten Code bekommen, der möglich ist.
Eigentlich war der schlechteste Code, den ich in Python gesehen habe, auch sehr cool :-) und völlig unbrauchbar.

Übrigens berücksichtigen die meisten Lösungen, die ich hier gesehen habe, nicht, wenn list [0] als False ausgewertet wird (z. B. leere Zeichenfolge oder Null). In diesem Fall geben alle None und nicht das richtige Element zurück.

rauben
quelle
In Python wird es eher als guter Stil angesehen, if lst:als zu schreiben if len(lst) > 0:. Verwenden Sie auch keine Python-Schlüsselwörter als Variablennamen. es endet in Tränen. Es ist üblich, Loder lstals Variablenname für eine Liste zu verwenden. Ich bin sicher, in diesem Fall wollten Sie nicht vorschlagen, tatsächlich listals Variablennamen zu verwenden, sondern nur "eine Liste". Und +1 für "wenn lst [0] zu False ausgewertet wird".
Steveha
Ja, ich habe zur besseren Übersicht nur den gleichen Namen wie OP beibehalten. Aber Sie haben definitiv Recht: Es sollte immer darauf geachtet werden, Python-Schlüsselwörter nicht zu überschreiben.
Rob
2

Python-Sprache für die Rückgabe des ersten Elements oder Keine?

Der pythonischste Ansatz ist der, der in der am besten bewerteten Antwort gezeigt wurde, und es war das erste, was mir beim Lesen der Frage in den Sinn kam. So verwenden Sie es zuerst, wenn die möglicherweise leere Liste an eine Funktion übergeben wird:

def get_first(l): 
    return l[0] if l else None

Und wenn die Liste von einer get_listFunktion zurückgegeben wird:

l = get_list()
return l[0] if l else None

Andere Möglichkeiten, dies zu tun, wurden hier anhand von Erklärungen demonstriert

for

Als ich anfing, über clevere Wege nachzudenken, war dies das zweite, woran ich dachte:

for item in get_list():
    return item

Dies setzt voraus, dass die Funktion hier endet und implizit zurückgibt, Nonewenn get_listeine leere Liste zurückgegeben wird. Der folgende explizite Code ist genau gleichwertig:

for item in get_list():
    return item
return None

if some_list

Das Folgende wurde ebenfalls vorgeschlagen (ich habe den falschen Variablennamen korrigiert), wobei auch das Implizite verwendet wird None. Dies wäre dem oben genannten vorzuziehen, da die logische Prüfung anstelle einer möglicherweise nicht stattfindenden Iteration verwendet wird. Dies sollte sofort leichter zu verstehen sein, was passiert. Wenn wir jedoch aus Gründen der Lesbarkeit und Wartbarkeit schreiben, sollten wir return Noneam Ende auch das Explizite hinzufügen :

some_list = get_list()
if some_list:
    return some_list[0]

Slice or [None]und wählen Sie den nullten Index

Dieser ist auch in der am besten bewerteten Antwort:

return (get_list()[:1] or [None])[0]

Das Slice ist nicht erforderlich und erstellt eine zusätzliche Liste mit einem Element im Speicher. Das Folgende sollte performanter sein. Um zu erklären, orgibt das zweite Element , wenn die erste ist , Falsein einem booleschen Kontext, also wenn get_listeine leere Liste zurückgegeben, der Ausdruck in den Klammern enthalten eine Liste mit ‚Keine‘ zurück, die dann durch den zugegriffen werden 0Index:

return (get_list() or [None])[0]

Der nächste verwendet die Tatsache, dass und das zweite Element zurückgibt, wenn sich das erste Truein einem booleschen Kontext befindet. Da es zweimal auf my_list verweist, ist es nicht besser als der ternäre Ausdruck (und technisch gesehen kein Einzeiler):

my_list = get_list() 
return (my_list and my_list[0]) or None

next

Dann haben wir den folgenden cleveren Einsatz des eingebauten nextunditer

return next(iter(get_list()), None)

Gibt zur Erklärung itereinen Iterator mit einer .nextMethode zurück. ( .__next__in Python 3.) Dann nextruft das eingebaute diese .nextMethode auf, und wenn der Iterator erschöpft ist, gibt es den von uns angegebenen Standard zurück.None .

redundanter ternärer Ausdruck (a if b else c ) und Zurückkreisen

Das Folgende wurde vorgeschlagen, aber das Umgekehrte wäre vorzuziehen, da die Logik normalerweise besser im Positiven als im Negativen verstanden wird. Da get_listzweimal aufgerufen wird, würde das Ergebnis schlecht funktionieren, es sei denn, das Ergebnis wird auf irgendeine Weise gespeichert.

return None if not get_list() else get_list()[0]

Das bessere Gegenteil:

return get_list()[0] if get_list() else None

Verwenden Sie noch besser eine lokale Variable, die get_listnur einmal aufgerufen wird, und Sie haben die empfohlene Pythonic-Lösung zuerst besprochen:

l = get_list()
return l[0] if l else None
Aaron Hall
quelle
2

In Bezug auf Idiome gibt es ein itertools Rezept genanntnth .

Aus itertools Rezepten:

def nth(iterable, n, default=None):
    "Returns the nth item or a default value"
    return next(islice(iterable, n, None), default)

Wenn Sie Einzeiler möchten, sollten Sie eine Bibliothek installieren, die dieses Rezept für Sie implementiert, z more_itertools.

import more_itertools as mit

mit.nth([3, 2, 1], 0)
# 3

mit.nth([], 0)                                             # default is `None`
# None

Es steht ein weiteres Tool zur Verfügung, das nur das erste aufgerufene Element zurückgibt more_itertools.first.

mit.first([3, 2, 1])
# 3

mit.first([], default=None)
# None

Diese itertools werden generisch für alle iterierbaren Elemente skaliert, nicht nur für Listen.

Pylang
quelle
2

my_list[0] if len(my_list) else None

Nicholas Hamilton
quelle
1
Sie verwenden lenohne Grund. Wenn Sie es löschen würden, würde der obige Code dasselbe tun.
Daniel Moskovich
1

Aus Neugier habe ich zwei der Lösungen zeitlich festgelegt. Die Lösung, die eine return-Anweisung verwendet, um eine for-Schleife vorzeitig zu beenden, ist auf meinem Computer mit Python 2.5.1 etwas teurer. Ich vermute, dies hat mit dem Einrichten der Iterable zu tun.

import random
import timeit

def index_first_item(some_list):
    if some_list:
        return some_list[0]


def return_first_item(some_list):
    for item in some_list:
        return item


empty_lists = []
for i in range(10000):
    empty_lists.append([])

assert empty_lists[0] is not empty_lists[1]

full_lists = []
for i in range(10000):
    full_lists.append(list([random.random() for i in range(10)]))

mixed_lists = empty_lists[:50000] + full_lists[:50000]
random.shuffle(mixed_lists)

if __name__ == '__main__':
    ENV = 'import firstitem'
    test_data = ('empty_lists', 'full_lists', 'mixed_lists')
    funcs = ('index_first_item', 'return_first_item')
    for data in test_data:
        print "%s:" % data
        for func in funcs:
            t = timeit.Timer('firstitem.%s(firstitem.%s)' % (
                func, data), ENV)
            times = t.repeat()
            avg_time = sum(times) / len(times)
            print "  %s:" % func
            for time in times:
                print "    %f seconds" % time
            print "    %f seconds avg." % avg_time

Dies sind die Timings, die ich bekommen habe:

leere_Listen:
  index_first_item:
    0,748353 Sekunden
    0,741086 Sekunden
    0,741191 Sekunden
    0,743543 Sekunden Durchschn.
  return_first_item:
    0,785511 Sekunden
    0,822178 Sekunden
    0,782846 Sekunden
    0,796845 Sekunden Durchschn.
full_lists:
  index_first_item:
    0,762618 Sekunden
    0,788040 Sekunden
    0,786849 Sekunden
    0,779169 Sekunden Durchschn.
  return_first_item:
    0,802735 Sekunden
    0,878706 Sekunden
    0,808781 Sekunden
    0,830074 Sekunden Durchschn.
gemischte_Listen:
  index_first_item:
    0,791129 Sekunden
    0,743526 Sekunden
    0,744441 Sekunden
    0,759699 Sekunden Durchschn.
  return_first_item:
    0,784801 Sekunden
    0,785146 Sekunden
    0,840193 Sekunden
    0,803380 Sekunden Durchschn.
gotgenes
quelle
0
try:
    return a[0]
except IndexError:
    return None
Limscoder
quelle
1
Ausnahmen werden im Allgemeinen nicht für die Flusskontrolle verwendet.
Matt Green
Ich denke nicht, dass es genau die Redewendung ist, nach der ich gesucht habe, diesen Code zu verlängern und ihm eine Ausnahmebehandlung hinzuzufügen.
Robert Rossney
3
Aber das ist eine verbreitete Python-Sprache! Aus Leistungsgründen verwenden Sie es möglicherweise nicht. Sie werden eine bessere Leistung erzielen, if len(a) > 0:aber dies wird als guter Stil angesehen. Beachten Sie, wie gut dies das Problem ausdrückt: "Versuchen Sie, den Kopf einer Liste zu extrahieren, und kehren Sie zurück, wenn dies nicht funktioniert. None" Google-Suche nach "EAFP" oder schauen Sie hier: python.net/~goodger/projects/pycon/2007/idiomatic/…
steveha
@steveha Es hängt von Ihren Daten ab. Wenn len (a) normalerweise> 0 ist und len (a) <1 ein seltener Zustand ist, ist das Abfangen der Ausnahme tatsächlich leistungsfähiger.
Limscoder
@ limscoder, ich stimme dir zu. Ich habe nur nicht näher darauf eingegangen, wann Sie es aus Leistungsgründen möglicherweise nicht verwenden. Ich habe nicht gesagt, dass du das niemals benutzen würdest.
Steveha
0
def head(iterable):
    try:
        return iter(iterable).next()
    except StopIteration:
        return None

print head(xrange(42, 1000)  # 42
print head([])               # None

Übrigens: Ich würde Ihren allgemeinen Programmablauf in etwa so überarbeiten:

lists = [
    ["first", "list"],
    ["second", "list"],
    ["third", "list"]
]

def do_something(element):
    if not element:
        return
    else:
        # do something
        pass

for li in lists:
    do_something(head(li))

(Vermeiden Sie Wiederholungen, wann immer dies möglich ist.)

ttepasse
quelle
0

Wie wäre es damit:

(my_list and my_list[0]) or None

Hinweis: Dies sollte für Objektlisten gut funktionieren, kann jedoch bei einer Nummern- oder Zeichenfolgenliste gemäß den folgenden Kommentaren zu einer falschen Antwort führen.

VitalyB
quelle
Was ist mit ([0,1] and 0) or None!
Kenly
Das ist ein guter Punkt ... Unsicher bei der Verwendung mit
Zahlensammlungen
Gleiches mit (['','A'] and '') or None.
Kenly
Wenn my_list[0]als ausgewertet wird False, sollte das Ergebnis sein None.
Kenly
2
my_list[0] if len(my_list) else None
Nicholas Hamilton
0

Ich bin mir nicht sicher, wie pythonisch das ist, aber bis es eine erste Funktion in der Bibliothek gibt, füge ich dies in die Quelle ein:

first = lambda l, default=None: next(iter(l or []), default)

Es ist nur eine Zeile (entspricht Schwarz) und vermeidet Abhängigkeiten.

Laktak
quelle
-1

Verwenden des and-or-Tricks:

a = get_list()
return a and a[0] or None
Titandecoy
quelle
-1

Wahrscheinlich nicht die schnellste Lösung, aber niemand erwähnte diese Option:

dict(enumerate(get_list())).get(0)

Wenn Sie zurückkehren können, get_list()können NoneSie Folgendes verwenden:

dict(enumerate(get_list() or [])).get(0)

Vorteile:

-eine Linie

-Du rufst nur get_list()einmal an

-einfach zu verstehen

Eric Marcos
quelle
-1

Mein Anwendungsfall bestand nur darin, den Wert einer lokalen Variablen festzulegen.

Persönlich fand ich den Versuch und außer Stilreiniger zu lesen

items = [10, 20]
try: first_item = items[0]
except IndexError: first_item = None
print first_item

als eine Liste zu schneiden.

items = [10, 20]
first_item = (items[:1] or [None, ])[0]
print first_item
bkowshik
quelle
-1

Einige Leute haben vorgeschlagen, so etwas zu tun:

list = get_list()
return list and list[0] or None

Das funktioniert in vielen Fällen, aber es funktioniert nur, wenn list [0] nicht gleich 0, False oder einer leeren Zeichenfolge ist. Wenn list [0] 0, False oder eine leere Zeichenfolge ist, gibt die Methode fälschlicherweise None zurück.

Ich habe diesen Fehler zu oft in meinem eigenen Code erstellt!

Clint Miller
quelle
3
Dies sollte eher ein Kommentar unter den fehlerhaften Antworten als eine eigenständige Antwort sein.
IJ Kennedy
-2

Sie können die Extraktionsmethode verwenden . Mit anderen Worten, extrahieren Sie diesen Code in eine Methode, die Sie dann aufrufen würden.

Ich würde nicht versuchen, es viel mehr zu komprimieren, die Einzeiler scheinen schwerer zu lesen als die ausführliche Version. Und wenn Sie die Extraktionsmethode verwenden, ist es ein Einzeiler;)

Stephane Grenier
quelle
-2
if mylist != []:

       print(mylist[0])

   else:

       print(None)
PrabhuPrakash
quelle
-3

ist nicht die idiomatische Python, die ternären Operatoren im C-Stil entspricht

cond and true_expr or false_expr

dh.

list = get_list()
return list and list[0] or None
Jimmy
quelle
Wenn eine [0] die Zahl 0 oder die leere Zeichenfolge ist (oder irgendetwas anderes, das als falsch ausgewertet wird), gibt dies None zurück, anstatt was eine [0] tatsächlich ist.
Adam Rosenfield