2249 Stimmen

Wie erhalte ich die Anzahl der Elemente in einer Liste in Python?

Wie kann ich die Anzahl der Elemente in der Liste ermitteln? items ?

items = ["apple", "orange", "banana"]

# There are 3 items.

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?

2925voto

gnud Punkte 75549

Die len() Funktion kann mit mehreren verschiedenen Typen in Python verwendet werden - sowohl mit eingebauten Typen als auch mit Bibliothekstypen. Zum Beispiel:

>>> len([1, 2, 3])
3

303voto

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.

Erläuterung

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 .

Von der docs

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.

Eingebaute Typen können Sie die len (Länge) von

Und 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

Nicht verwenden len zur Prüfung auf eine leere oder nicht leere Liste

Um 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.

79voto

Naftuli Kay Punkte 82152

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.

28voto

MSeifert Punkte 131411

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!

14voto

Jonathan Komar Punkte 2312

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.com

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.

Powered by:

X