Folgendes berücksichtigen:
items = []
items.append("Apple")
items.append("orange")
items.append("banana")
# FAKE METHOD:
items.amount() # Should return 3
Wie erhalte ich die Anzahl der Elemente in der Liste items
?
Wie bekomme ich die Größe einer Liste?
Verwenden Sie die integrierte Funktion len
, um die Größe einer Liste zu ermitteln:
items = []
items.append("Apple")
items.append("orange")
items.append("banana")
Und nun:
len(items)
gibt 3 zurück.
Alles in Python ist ein Objekt, einschließlich Listen. Alle Objekte haben in der C-Implementierung eine Art Header.
Insbesondere Listen und ähnliche eingebaute Objekte mit einer "Größe" in Python haben ein Attribut namens ob_size
, in dem die Anzahl der Elemente im Objekt zwischengespeichert wird. Das Überprüfen der Anzahl der Objekte in einer Liste ist also sehr schnell.
Wenn Sie jedoch prüfen, ob die Listengröße Null ist oder nicht, verwenden Sie nicht len
. Stattdessen wird die Liste mit in einen booleschen Kontext gestellt. Andernfalls wird sie als Falsch behandelt, wenn leer, andernfalls als Wahr .
len(s)
Gibt die Länge (die Anzahl der Elemente) eines Objekts zurück. Das Argument kann eine Sequenz (z. B. ein String, Bytes, Tupel, eine Liste oder ein Bereich) oder eine Sammlung (z. B. ein Dictionary, eine Menge oder eine eingefrorene Menge) sein.
len
wird mit __len__
aus dem Datenmodell docs implementiert:
object.__len__(self)
Wird aufgerufen, um die integrierte Funktion
len()
zu implementieren. Soll die Länge des Objekts zurückgeben, eine Ganzzahl> = 0. Außerdem ein Objekt, das keine__nonzero__()
[in Python 2 oder__bool__()
in Python 3] -Methode definiert und dessen Die Methode__len__()
, die Null zurückgibt, wird in einem Booleschen Kontext als falsch betrachtet.
Und wir können auch sehen, dass __len__
eine Methode von Listen ist:
items.__len__()
gibt 3 zurück.
len
(Länge) vonUnd tatsächlich sehen wir, dass wir diese Informationen für alle beschriebenen Typen erhalten können:
>>> all(hasattr(cls, '__len__') for cls in (str, bytes, Tuple, list,
xrange, dict, set, frozenset))
True
len
nicht, um auf eine leere oder nicht leere Liste zu testenUm eine bestimmte Länge zu testen, testen Sie einfach die Gleichheit:
if len(items) == required_length:
...
Es gibt jedoch einen speziellen Fall für das Testen einer Liste mit der Länge Null oder umgekehrt. Testen Sie in diesem Fall nicht die Gleichheit.
Tun Sie auch nicht:
if len(items):
...
Tun Sie stattdessen einfach Folgendes:
if items: # Then we have some items, not empty!
...
oder
if not items: # Then we have an empty list!
...
Ich erkläre , warum hier , aber kurz gesagt, if items
oder if not items
sowohl lesbarer als auch performanter ist.
Obwohl dies aufgrund der Tatsache, dass es viel sinnvoller wäre, "out of the box" -Funktionalität zu sein, möglicherweise nicht sinnvoll ist, besteht ein ziemlich einfacher Hack darin, eine Klasse mit einer length
-Eigenschaft zu erstellen:
class slist(list):
@property
def length(self):
return len(self)
Du kannst es so benutzen:
>>> l = slist(range(10))
>>> l.length
10
>>> print l
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
Im Wesentlichen ist es genau identisch mit einem Listenobjekt, mit dem zusätzlichen Vorteil, dass es eine OOP-freundliche length
-Eigenschaft besitzt.
Wie immer kann Ihr Kilometerstand variieren.
Neben len
können Sie auch operator.length_hint
verwenden (erfordert Python 3.4+). Für einen normalen list
sind beide gleichwertig, aber _length_hint
_ ermöglicht es, die Länge eines Listeniterators abzurufen, was unter bestimmten Umständen nützlich sein kann:
_>>> from operator import length_hint
>>> l = ["Apple", "orange", "banana"]
>>> len(l)
3
>>> length_hint(l)
3
>>> list_iterator = iter(l)
>>> len(list_iterator)
TypeError: object of type 'list_iterator' has no len()
>>> length_hint(list_iterator)
3
_
Aber _length_hint
_ ist per Definition nur ein "Hinweis", daher ist len
die meiste Zeit besser.
Ich habe mehrere Antworten gesehen, die darauf hindeuten, auf ___len__
_ zuzugreifen. Dies ist in Ordnung, wenn es sich um integrierte Klassen wie list
handelt, kann jedoch zu Problemen mit benutzerdefinierten Klassen führen, da len
(und _length_hint
_) einige Sicherheitsprüfungen implementieren. Beispielsweise erlauben beide keine negativen Längen oder Längen, die einen bestimmten Wert überschreiten (den Wert _sys.maxsize
_). Es ist also immer sicherer, die Funktion len
anstelle der Methode ___len__
_ zu verwenden!
Und der Vollständigkeit halber ist es möglich, ohne die Funktion len()
zu verwenden (ich würde dies nicht als gute Option dulden. PROGRAMMIEREN SIE NICHT WIE DIESES IN PYTHON):
def count(list):
item_count = 0
for item in list[:]:
item_count += 1
return item_count
count([1,2,3,4,5])
(Der Doppelpunkt in list[:]
ist implizit und daher auch optional.)
Die Lektion für neue Programmierer lautet: Sie können die Anzahl der Elemente in einer Liste nicht ermitteln, ohne sie irgendwann zu zählen. Aus rechnerischer Sicht ist es besser, die Anzahl der Elemente zu verfolgen, wenn Sie sie hinzufügen. Siehe die Antwort von Naftuli Kay.
Beantwortung Ihrer Frage wie in den zuvor gegebenen Beispielen:
items = []
items.append("Apple")
items.append("orange")
items.append("banana")
print items.__len__()