Wie kann ich die Anzahl der Elemente in der Liste ermitteln? items
?
items = ["apple", "orange", "banana"]
# There are 3 items.
Wie kann ich die Anzahl der Elemente in der Liste ermitteln? items
?
items = ["apple", "orange", "banana"]
# There are 3 items.
Wie kann man die Größe einer Liste ermitteln?
Um die Größe einer Liste zu ermitteln, verwenden Sie die eingebaute Funktion, len
:
items = []
items.append("apple")
items.append("orange")
items.append("banana")
Und jetzt:
len(items)
kehrt zurück 3.
In Python ist alles ein Objekt, auch Listen. Alle Objekte haben in der C-Implementierung eine Art Kopfzeile.
Listen und andere ähnliche eingebaute Objekte mit einer "Größe" haben in Python ein Attribut namens ob_size
wobei die Anzahl der Elemente des Objekts zwischengespeichert wird. Die Überprüfung der Anzahl der Objekte in einer Liste ist also sehr schnell.
Aber wenn Sie prüfen, ob die Listengröße Null ist oder nicht, verwenden Sie nicht len
- stattdessen, die Liste in einen booleschen Kontext setzen - sie wird als False behandelt, wenn sie leer ist, ansonsten als True .
len(s)
Gibt die Länge (die Anzahl der Elemente) eines Objekts zurück. Das Argument kann eine Sequenz sein (z. B. eine Zeichenkette, Bytes, ein Tupel, eine Liste oder ein Bereich) oder eine Sammlung (z. B. ein Wörterbuch, eine Menge oder eine eingefrorene Menge) sein.
len
wird implementiert mit __len__
aus dem Datenmodell docs :
object.__len__(self)
Aufgerufen zur Implementierung der eingebauten Funktion
len()
. sollte die Länge des Objekts zurückgeben, eine ganze Zahl >= 0. Außerdem kann ein Objekt, das keine definiert__nonzero__()
[in Python 2 oder__bool__()
in Python 3] Methode und deren__len__()
Methode gibt Null zurück wird in einem booleschen Kontext als falsch betrachtet.
Und wir können auch sehen, dass __len__
ist eine Methode der Listen:
items.__len__()
kehrt zurück 3.
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,
range, dict, set, frozenset))
True
len
zur Prüfung auf eine leere oder nicht leere ListeUm auf eine bestimmte Länge zu testen, genügt es natürlich, auf Gleichheit zu prüfen:
if len(items) == required_length:
...
Es gibt jedoch einen Sonderfall für die Prüfung auf eine Liste mit der Länge Null oder die Umkehrung. In diesem Fall wird nicht auf Gleichheit geprüft.
Tun Sie das auch nicht:
if len(items):
...
Tun Sie es stattdessen einfach:
if items: # Then we have some items, not empty!
...
oder
if not items: # Then we have an empty list!
...
I hier erklären, warum aber kurz gesagt, if items
oder if not items
ist sowohl besser lesbar als auch leistungsfähiger.
Obwohl dies vielleicht nicht sinnvoll ist, da es viel mehr Sinn machen würde, als "out of the box"-Funktionalität, wäre ein ziemlich einfacher Hack, eine Klasse mit einer length
Eigentum:
class slist(list):
@property
def length(self):
return len(self)
Sie können ihn wie folgt verwenden:
>>> l = slist(range(10))
>>> l.length
10
>>> print l
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
Im Wesentlichen ist es genau das gleiche wie ein Listenobjekt, mit dem zusätzlichen Vorteil, dass es eine OOP-freundliche length
Eigentum.
Wie immer gilt: Je nachdem, was Sie wollen.
Neben len
können Sie auch verwenden operator.length_hint
(erfordert Python 3.4+). Für eine normale list
beide sind gleichwertig, aber length_hint
ermöglicht es, die Länge eines Listen-Iterators zu ermitteln, 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", so dass die meiste Zeit len
ist besser.
Ich habe mehrere Antworten gesehen, die den Zugriff auf __len__
. Dies ist in Ordnung, wenn man mit eingebauten Klassen wie list
aber es könnte zu Problemen mit benutzerdefinierten Klassen führen, weil len
(und length_hint
) einige Sicherheitskontrollen durchführen. Zum Beispiel lassen beide keine negativen Längen oder Längen, die einen bestimmten Wert überschreiten, zu (die sys.maxsize
Wert). Es ist also immer sicherer, die len
statt der Funktion __len__
Methode!
Und der Vollständigkeit halber (vor allem aus pädagogischen Gründen), ist es möglich, ohne die Verwendung der len()
Funktion. Ich würde dies nicht als eine gute Option befürworten PROGRAMMIEREN SIE NICHT SO IN PYTHON aber es dient dem Zweck, Algorithmen zu lernen.
def count(list):
item_count = 0
for item in list[:]:
item_count += 1
return item_count
count([1,2,3,4,5])
(Die Indexoperation mit Doppelpunkt in list[:]
ist implizit und daher ebenfalls optional).
Die Lektion für neue Programmierer lautet hier: Man kann die Anzahl der Elemente in einer Liste nicht ermitteln, ohne sie zu einem bestimmten Zeitpunkt zu zählen. Die Frage ist nur: Wann ist ein guter Zeitpunkt, um sie zu zählen? Hochleistungsfähiger Code wie der Systemaufruf connect für Sockets (geschrieben in C) zum Beispiel connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
berechnet nicht die Länge der Elemente (diese Aufgabe wird dem aufrufenden Code überlassen). Beachten Sie, dass die Länge der Adresse weitergegeben wird, um den Schritt des Zählens der Länge zu sparen. Eine andere Möglichkeit: Aus rechnerischer Sicht könnte es sinnvoll sein, die Anzahl der Elemente zu verfolgen, während Sie sie innerhalb des übergebenen Objekts hinzufügen. Beachten Sie, dass dies mehr Speicherplatz benötigt. Siehe Naftuli Kays Antwort .
Beispiel für die Verfolgung der Länge, um die Leistung zu verbessern und gleichzeitig mehr Platz im Speicher zu belegen. Beachten Sie, dass ich nie die Funktion len() verwende, weil die Länge verfolgt wird:
class MyList(object):
def __init__(self):
self._data = []
self.length = 0 # length tracker that takes up memory but makes length op O(1) time
# the implicit iterator in a list class
def __iter__(self):
for elem in self._data:
yield elem
def add(self, elem):
self._data.append(elem)
self.length += 1
def remove(self, elem):
self._data.remove(elem)
self.length -= 1
mylist = MyList()
mylist.add(1)
mylist.add(2)
mylist.add(3)
print(mylist.length) # 3
mylist.remove(3)
print(mylist.length) # 2
CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.
33 Stimmen
Sie fragen offensichtlich nach der Anzahl der Elemente in der Liste. Wenn ein Suchender hierher kommt und nach der Größe des Objekts im Speicher sucht, ist dies die eigentliche Frage und die Antwort, die er sucht: Wie kann ich die Größe eines Objekts in Python bestimmen?