una - ordinare lista python




Come ottenere il numero di elementi in una lista in Python? (4)

Come ottenere la dimensione di una lista?

Per trovare la dimensione di una lista, usa la funzione builtin, len :

items = []
items.append("apple")
items.append("orange")
items.append("banana")

E adesso:

len(items)

ritorna 3.

Spiegazione

Tutto in Python è un oggetto, inclusi gli elenchi. Tutti gli oggetti hanno un'intestazione di qualche tipo nell'implementazione C.

Gli elenchi e altri oggetti incorporati simili con una "dimensione" in Python, in particolare, hanno un attributo chiamato ob_size , in cui il numero di elementi nell'oggetto è memorizzato nella cache. Quindi controllare il numero di oggetti in una lista è molto veloce.

Ma se stai controllando se la dimensione dell'elenco è zero o no, non usare len - invece, metti la lista in un contesto booleano - viene trattata come False se vuota, Vero altrimenti .

Dai docs

len(s)

Restituisce la lunghezza (il numero di oggetti) di un oggetto. L'argomento può essere una sequenza (come una stringa, un byte, una tupla, un elenco o un intervallo) o una raccolta (come un dizionario, un set o un set congelato).

len è implementato con __len__ , dai docs modello dati:

object.__len__(self)

Chiamato per implementare la funzione built-in len() . Dovrebbe restituire la lunghezza dell'oggetto, un numero intero> = 0. Inoltre, un oggetto che non definisce un __nonzero__() [in Python 2 o __bool__() in Python 3] e il cui metodo __len__() restituisce zero è considerato essere falso in un contesto booleano.

E possiamo anche vedere che __len__ è un metodo di liste:

items.__len__()

ritorna 3.

Tipi di builtin è possibile ottenere il len (lunghezza) di

E infatti vediamo che possiamo ottenere queste informazioni per tutti i tipi descritti:

>>> all(hasattr(cls, '__len__') for cls in (str, bytes, tuple, list, 
                                            xrange, dict, set, frozenset))
True

Non usare len per testare un elenco vuoto o non vuoto

Per testare per una lunghezza specifica, ovviamente, basta testare l'uguaglianza:

if len(items) == required_length:
    ...

Ma c'è un caso speciale per testare una lista di lunghezza zero o l'inversa. In tal caso, non testare per l'uguaglianza.

Inoltre, non fare:

if len(items): 
    ...

Invece, fai semplicemente:

if items:     # Then we have some items, not empty!
    ...

o

if not items: # Then we have an empty list!
    ...

Spiego perché qui, ma in breve, if items o if not items sono entrambi più leggibili e più performanti.

items = []
items.append("apple")
items.append("orange")
items.append("banana")

# FAKE METHOD::
items.amount()  # Should return 3

Come ottengo il numero di elementi nella lista?


Anche se questo potrebbe non essere utile a causa del fatto che avrebbe molto più senso come funzionalità "out of the box", un hack abbastanza semplice sarebbe quello di costruire una classe con una proprietà length :

class slist(list):
    @property
    def length(self):
        return len(self)

Puoi usarlo in questo modo:

>>> l = slist(range(10))
>>> l.length
10
>>> print l
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

Essenzialmente, è esattamente identico a un oggetto elenco, con l'ulteriore vantaggio di avere una proprietà di length compatibile con OOP.

Come sempre, il tuo chilometraggio può variare.


La funzione len() può essere usata con molti tipi in Python - sia tipi built-in che tipi di libreria.

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

Oltre a docs puoi anche usare operator.length_hint (richiede python 3.4+). Per la list normale entrambi sono equivalenti, ma length_hint consente di ottenere la lunghezza di un iteratore di elenchi, che potrebbe essere utile in determinate circostanze:

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

Ma length_hint è per definizione solo un "suggerimento", quindi la maggior parte delle volte len è migliore.

Ho visto diverse risposte a suggerire l'accesso a __len__ . Questo va bene quando si tratta di classi built-in come list ma potrebbe portare a problemi con le classi personalizzate perché len (e length_hint ) implementano alcuni controlli di sicurezza. Ad esempio, entrambi non consentono lunghezze o lunghezze negative superiori a un determinato valore (il valore sys.maxsize ). Quindi è sempre più sicuro usare la funzione len posto del metodo __len__ !





list