Qual è la differenza?
Quali sono i vantaggi / gli svantaggi delle tuple / liste?
list
. ; D
Qual è la differenza?
Quali sono i vantaggi / gli svantaggi delle tuple / liste?
list
. ; D
Risposte:
Oltre alle immutabili tuple, esiste anche una distinzione semantica che dovrebbe guidarne l'uso. Le tuple sono strutture di dati eterogenee (ovvero, le loro voci hanno significati diversi), mentre gli elenchi sono sequenze omogenee. Le tuple hanno struttura, le liste hanno ordine.
L'uso di questa distinzione rende il codice più esplicito e comprensibile.
Un esempio potrebbe essere rappresentato dalle coppie di pagine e numero di riga per fare riferimento alle posizioni in un libro, ad esempio:
my_location = (42, 11) # page number, line number
È quindi possibile utilizzare questo come chiave in un dizionario per memorizzare le note nelle posizioni. Un elenco d'altra parte potrebbe essere utilizzato per memorizzare più posizioni. Naturalmente si potrebbe desiderare di aggiungere o rimuovere posizioni dall'elenco, quindi ha senso che le liste siano mutabili. D'altra parte non ha senso aggiungere o rimuovere elementi da una posizione esistente, quindi le tuple sono immutabili.
Potrebbero verificarsi situazioni in cui si desidera modificare gli elementi all'interno di una tupla di posizione esistente, ad esempio quando si scorre tra le righe di una pagina. Ma l'immutabilità della tupla ti costringe a creare una nuova tupla di posizione per ogni nuovo valore. Ciò sembra inopportuno, ma l'utilizzo di dati immutabili come questo è una pietra miliare di tipi di valore e tecniche di programmazione funzionale, che possono avere vantaggi sostanziali.
Ci sono alcuni articoli interessanti su questo argomento, ad esempio "Le tuple Python non sono solo elenchi costanti" o "Comprensione delle tuple e degli elenchi in Python" . La documentazione ufficiale di Python menziona anche questo
"Le tuple sono immutabili e di solito contengono una sequenza eterogenea ...".
In un linguaggio tipicamente statico come Haskell i valori in una tupla generalmente hanno tipi diversi e la lunghezza della tupla deve essere fissa. In un elenco i valori hanno tutti lo stesso tipo e la lunghezza non è fissa. Quindi la differenza è molto evidente.
Infine c'è la tupla di nome in Python, che ha senso perché una tupla dovrebbe già avere una struttura. Ciò sottolinea l'idea che le tuple sono un'alternativa leggera a classi e istanze.
collections.namedtuple
sarebbe meglio chiamarlo collections.record
. Non avrebbe senso scambiare, per esempio, il nome e l'indirizzo in un record del cliente; infatti, farlo in genere sarebbe un errore, che l'immutabilità della tupla ti impedisce di commettere.
What would you do with such a list?
, rabbrividisco sempre quando ppl usa la mancanza di fantasia come argomento. L'uso di elenchi di tipi misti funziona egregiamente, ad esempio per alcune strutture di dati gerarchiche, in cui ogni elenco è composto da liste figlio ed elementi valore.
Differenza tra elenco e tupla
Letterale
someTuple = (1,2)
someList = [1,2]
Dimensione
a = tuple(range(1000))
b = list(range(1000))
a.__sizeof__() # 8024
b.__sizeof__() # 9088
A causa delle dimensioni più ridotte di un'operazione di tupla, diventa un po 'più veloce, ma non tanto da menzionare fino a quando non si ha un numero enorme di elementi.
Operazioni consentite
b = [1,2]
b[0] = 3 # [3, 2]
a = (1,2)
a[0] = 3 # Error
Ciò significa anche che non è possibile eliminare un elemento o ordinare una tupla. Tuttavia, potresti aggiungere un nuovo elemento sia all'elenco che alla tupla con l'unica differenza che, poiché la tupla è immutabile, non stai davvero aggiungendo un elemento ma stai creando una nuova tupla, quindi l'id di cambierà
a = (1,2)
b = [1,2]
id(a) # 140230916716520
id(b) # 748527696
a += (3,) # (1, 2, 3)
b += [3] # [1, 2, 3]
id(a) # 140230916878160
id(b) # 748527696
uso
Poiché un elenco è modificabile, non può essere utilizzato come chiave in un dizionario, mentre è possibile utilizzare una tupla.
a = (1,2)
b = [1,2]
c = {a: 1} # OK
c = {b: 1} # Error
3. Permitted operation
mostra prima il caso tupla. So che è normale mostrare successo, quindi errore, ma questo mi ha incasinato per qualche istante.
one_item_list = [a]
, ma one_tuple = (a,)
è la tupla corrispondente. Nota la virgola che segue il nome della variabile. Ma nota anche two_tuple = (a, b)
. Questo mi ha gettato via più di una volta (ancora lì in Python 3).
tuple(sorted(the_unsorted_tuple))
Se sei andato a fare una passeggiata, puoi annotare le tue coordinate in qualsiasi momento in una (x,y)
tupla.
Se desideri registrare il tuo viaggio, puoi aggiungere la tua posizione ogni pochi secondi a un elenco.
Ma non puoi farlo al contrario.
La differenza fondamentale è che le tuple sono immutabili. Ciò significa che non è possibile modificare i valori in una tupla dopo averla creata.
Quindi se hai bisogno di cambiare i valori usa un Elenco.
Vantaggi per le tuple:
frozenset
o i vari dict / tree / etc congelati di terze parti. tipi, ma nessuno di questi ti consente di aggiungere elementi mutabili. (E ovviamente una tupla è seccabile solo se tutti i suoi elementi lo sono, che è maniglie nel solito modo EAFP, quindi d[1, [2]]
aumenterà TypeError: unhashable type: 'list'
.)
Le liste sono mutabili; le tuple no.
Da docs.python.org/2/tutorial/datastructures.html
Le tuple sono immutabili e di solito contengono una sequenza eterogenea di elementi a cui si accede tramite decompressione (vedere più avanti in questa sezione) o indicizzazione (o anche per attributo nel caso di denominate coppie). Gli elenchi sono modificabili e i loro elementi sono generalmente omogenei e vi si accede ripetendo l'elenco.
È stato detto che la differenza è in gran parte semantica: le persone si aspettano che una tupla e un elenco rappresentino informazioni diverse. Ma questo va oltre una linea guida; alcune librerie si comportano in modo diverso in base a ciò che vengono passate. Prendi NumPy per esempio (copiato da un altro post in cui chiedo altri esempi):
>>> import numpy as np
>>> a = np.arange(9).reshape(3,3)
>>> a
array([[0, 1, 2],
[3, 4, 5],
[6, 7, 8]])
>>> idx = (1,1)
>>> a[idx]
4
>>> idx = [1,1]
>>> a[idx]
array([[3, 4, 5],
[3, 4, 5]])
Il punto è, mentre NumPy potrebbe non far parte della libreria standard, è una libreria Python principale , e all'interno di elenchi e tuple NumPy ci sono cose completamente diverse.
type(a_list) != type(a_tuple)
, quindi qualsiasi parte della ramificazione del codice della libreria basata type(x)
si comporterà in modo diverso
'%d %d' % [2, 3]
è un TypeError
, perché stai cercando di passare un elenco al primo %d
e non stai passando alcun valore al secondo %d
. (Tuttavia, ci sono anche contro-esempi, come max
...)
Le liste sono per il looping, le tuple sono per le strutture cioè "%s %s" %tuple
.
Le liste sono generalmente omogenee, le tuple sono generalmente eterogenee.
Gli elenchi sono per lunghezza variabile, le tuple sono per lunghezza fissa.
Questo è un esempio di elenchi Python:
my_list = [0,1,2,3,4]
top_rock_list = ["Bohemian Rhapsody","Kashmir","Sweet Emotion", "Fortunate Son"]
Questo è un esempio di tupla di Python:
my_tuple = (a,b,c,d,e)
celebrity_tuple = ("John", "Wayne", 90210, "Actor", "Male", "Dead")
Le liste e le tuple di Python sono simili in quanto entrambe sono raccolte ordinate di valori. Oltre alla differenza superficiale che gli elenchi vengono creati usando le parentesi "[..., ...]" e le tuple usando le parentesi "(..., ...)", la differenza tecnica "hard coded in Python syntax" tra di loro è che gli elementi di una particolare tupla sono immutabili mentre gli elenchi sono mutabili (... quindi solo le tuple sono cancellabili e possono essere usate come chiavi dizionario / hash!). Ciò comporta differenze nel modo in cui possono o non possono essere utilizzate (imposte a priori dalla sintassi) e differenze nel modo in cui le persone scelgono di usarle (incoraggiate come "migliori pratiche", a posteriori, questo è ciò che le fanno i programmatori ). persone intelligenti danno al ordine degli elementi.
Per le tuple, "ordine" non significa altro che una specifica "struttura" per contenere le informazioni. Quali valori si trovano nel primo campo possono essere facilmente commutati nel secondo campo poiché ognuno fornisce valori attraverso due diverse dimensioni o scale. Forniscono risposte a diversi tipi di domande e sono in genere della forma: per un dato oggetto / soggetto, quali sono i suoi attributi? L'oggetto / soggetto rimane costante, gli attributi differiscono.
Per gli elenchi, "ordine" indica una sequenza o una direzionalità. Il secondo elemento DEVE seguire il primo elemento perché è posizionato al 2 ° posto in base a una scala o dimensione particolare e comune. Gli elementi sono presi nel loro insieme e forniscono principalmente risposte a una singola domanda tipicamente del modulo, per un dato attributo, come si confrontano questi oggetti / soggetti? L'attributo rimane costante, l'oggetto / soggetto differisce.
Ci sono innumerevoli esempi di persone nella cultura popolare e programmatori che non si conformano a queste differenze e ci sono innumerevoli persone che potrebbero usare un'insalata per il loro corso principale. Alla fine della giornata, va bene e di solito entrambi possono fare il lavoro.
Riassumendo alcuni dei dettagli più fini
Somiglianze:
Indicizzazione, selezione e affettatura - Sia le tuple che gli elenchi vengono indicizzati utilizzando valori interi trovati tra parentesi. Quindi, se vuoi i primi 3 valori di un dato elenco o tupla, la sintassi sarebbe la stessa:
>>> my_list[0:3]
[0,1,2]
>>> my_tuple[0:3]
[a,b,c]
Confronto e ordinamento : due tuple o due elenchi vengono entrambi confrontati dal loro primo elemento, e se c'è un pareggio, quindi dal secondo elemento e così via. Non viene prestata ulteriore attenzione agli elementi successivi dopo che elementi precedenti mostrano una differenza.
>>> [0,2,0,0,0,0]>[0,0,0,0,0,500]
True
>>> (0,2,0,0,0,0)>(0,0,0,0,0,500)
True
Differenze: - A priori, per definizione
Sintassi : gli elenchi usano [], le tuple usano ()
Mutabilità - Gli elementi in un determinato elenco sono mutabili, gli elementi in una data tupla NON sono mutabili.
# Lists are mutable:
>>> top_rock_list
['Bohemian Rhapsody', 'Kashmir', 'Sweet Emotion', 'Fortunate Son']
>>> top_rock_list[1]
'Kashmir'
>>> top_rock_list[1] = "Stairway to Heaven"
>>> top_rock_list
['Bohemian Rhapsody', 'Stairway to Heaven', 'Sweet Emotion', 'Fortunate Son']
# Tuples are NOT mutable:
>>> celebrity_tuple
('John', 'Wayne', 90210, 'Actor', 'Male', 'Dead')
>>> celebrity_tuple[5]
'Dead'
>>> celebrity_tuple[5]="Alive"
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: 'tuple' object does not support item assignment
Hashtables (Dictionaries) - Dato che gli hashtables (dizionari) richiedono che le sue chiavi siano hash e quindi immutabili, solo le tuple possono agire come chiavi del dizionario, non elenchi.
#Lists CAN'T act as keys for hashtables(dictionaries)
>>> my_dict = {[a,b,c]:"some value"}
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: unhashable type: 'list'
#Tuples CAN act as keys for hashtables(dictionaries)
>>> my_dict = {("John","Wayne"): 90210}
>>> my_dict
{('John', 'Wayne'): 90210}
Differenze - A posteriori, in uso
Omo vs eterogeneità degli elementi - Generalmente gli oggetti elenco sono omogenei e gli oggetti tupla sono eterogenei. Cioè, le liste sono usate per oggetti / soggetti dello stesso tipo (come tutti i candidati presidenziali, o tutte le canzoni, o tutti i corridori) mentre sebbene non sia forzato da), mentre le tuple sono più per oggetti eterogenei.
Looping vs. Structures - Sebbene entrambi consentano il looping (per x in my_list ...), ha davvero senso farlo solo per un elenco. Le tuple sono più appropriate per strutturare e presentare informazioni (% s% s residente in% s è un% se attualmente% s% ("John", "Wayne", 90210, "Attore", "Morto")
I valori dell'elenco possono essere modificati in qualsiasi momento, ma i valori delle tuple non possono essere modificati.
I vantaggi e gli svantaggi dipendono dall'uso. Se si dispone di tali dati che non si desidera modificare, è necessario utilizzare la tupla, altrimenti l'elenco è l'opzione migliore.
Tuple ed elenchi sono entrambi tipi di sequenza apparentemente simili in Python.
Sintassi letterale
Usiamo le parentesi ( ) per costruire tuple e parentesi quadre
[ ]
per ottenere un nuovo elenco. Inoltre, possiamo usare la chiamata del tipo appropriato per ottenere la struttura richiesta - tupla o elenco.
someTuple = (4,6)
someList = [2,6]
Mutabilità
Le tuple sono immutabili, mentre le liste sono mutabili. Questo punto è la base per i seguenti.
Utilizzo della memoria
A causa della mutabilità, è necessaria più memoria per gli elenchi e meno memoria per le tuple.
Estensione
Puoi aggiungere un nuovo elemento sia alle tuple che agli elenchi con l'unica differenza che l'id della tupla verrà modificato (ovvero, avremo un nuovo oggetto).
hashing
Le tuple sono cancellabili e le liste no. Significa che puoi usare una tupla come chiave in un dizionario. L'elenco non può essere utilizzato come chiave in un dizionario, mentre è possibile utilizzare una tupla
tup = (1,2)
list_ = [1,2]
c = {tup : 1} # ok
c = {list_ : 1} # error
Semantica
Questo punto riguarda maggiormente le migliori pratiche. Dovresti usare le tuple come strutture di dati eterogenee, mentre gli elenchi sono sequenze omogenee.
Le liste sono intese come sequenze omogenee, mentre le tuple sono strutture di dati eterogenee.
Dato che le persone hanno già risposto qui che tuples
sono immutabili mentre lists
sono mutabili, ma c'è un aspetto importante dell'uso delle tuple che dobbiamo ricordare
Se tuple
contiene un list
o un dictionary
al suo interno, questi possono essere cambiati anche se lo tuple
stesso è immutabile.
Ad esempio, supponiamo di avere una tupla che contiene un elenco e un dizionario come
my_tuple = (10,20,30,[40,50],{ 'a' : 10})
possiamo cambiare il contenuto dell'elenco come
my_tuple[3][0] = 400
my_tuple[3][1] = 500
che fa apparire la nuova tupla
(10, 20, 30, [400, 500], {'a': 10})
possiamo anche cambiare il dizionario all'interno della tupla come
my_tuple[4]['a'] = 500
che farà apparire la tupla complessiva
(10, 20, 30, [400, 500], {'a': 500})
Ciò accade perché list
e dictionary
sono gli oggetti e questi oggetti non cambiano, ma i contenuti a cui punta.
Quindi tuple
rimane immutabile senza alcuna eccezione
Il PEP 484 - Type Hints afferma che i tipi di elementi di a tuple
possono essere digitati individualmente; in modo che tu possa dire Tuple[str, int, float]
; ma a list
, con la List
classe di digitazione può prendere solo un parametro di tipo:, il List[str]
che suggerisce che la differenza del 2 è che il primo è eterogeneo, mentre il secondo intrinsecamente omogeneo.
Inoltre, la libreria standard utilizza principalmente la tupla come valore di ritorno da tali funzioni standard in cui la C restituisce a struct
.
Dato che la gente ha già menzionato le differenze, scriverò sul perché le tuple.
Perché le tuple sono preferite?
Ottimizzazione dell'allocazione per piccole tuple
Per ridurre la frammentazione della memoria e accelerare le allocazioni, Python riutilizza vecchie tuple. Se una tupla non è più necessaria e contiene meno di 20 elementi invece di eliminarla definitivamente, Python la sposta in un elenco libero.
Un elenco gratuito è diviso in 20 gruppi, in cui ciascun gruppo rappresenta un elenco di tuple di lunghezza n tra 0 e 20. Ogni gruppo può memorizzare fino a 2 000 tuple. Il primo (zero) gruppo contiene solo 1 elemento e rappresenta una tupla vuota.
>>> a = (1,2,3)
>>> id(a)
4427578104
>>> del a
>>> b = (1,2,4)
>>> id(b)
4427578104
Nell'esempio sopra possiamo vedere che aeb hanno lo stesso id. Questo perché abbiamo immediatamente occupato una tupla distrutta che era nella lista libera.
Ottimizzazione dell'allocazione per elenchi
Poiché gli elenchi possono essere modificati, Python non utilizza la stessa ottimizzazione delle tuple. Tuttavia, anche gli elenchi Python hanno un elenco gratuito, ma viene utilizzato solo per oggetti vuoti. Se un elenco vuoto viene eliminato o raccolto da GC, può essere riutilizzato in seguito.
>>> a = []
>>> id(a)
4465566792
>>> del a
>>> b = []
>>> id(b)
4465566792
Fonte: https://rushter.com/blog/python-lists-and-tuples/
Perché le tuple sono efficienti delle liste? -> https://stackoverflow.com/a/22140115
Una citazione di direzione dalla documentazione del 5.3. Tuple e sequenze :
Sebbene le tuple possano sembrare simili agli elenchi, sono spesso utilizzate in diverse situazioni e per scopi diversi. Le tuple sono immutabili e di solito contengono una sequenza eterogenea di elementi a cui si accede tramite decompressione (vedere più avanti in questa sezione) o indicizzazione (o anche per attributo nel caso di tuple nominate). Liste sono mutabili , ei loro elementi sono generalmente omogenei e sono accessibili scorrendo sull'elenco.
Prima di tutto, entrambi sono gli oggetti non scalari (noti anche come oggetti composti) in Python.
+
(la nuova tupla verrà creata ovviamente)(3,) # -> (3)
invece di(3) # -> 3
[3]
new_array = origin_array[:]
[x**2 for x in range(1,7)]
ti dà
[1,4,9,16,25,36]
(Non leggibile)L'uso dell'elenco può anche causare un errore di aliasing (due percorsi distinti che puntano allo stesso oggetto).
Le liste sono mutabili e le tuple sono immutabili. Considera solo questo esempio.
a = ["1", "2", "ra", "sa"] #list
b = ("1", "2", "ra", "sa") #tuple
Ora cambia i valori dell'indice di elenco e tupla.
a[2] = 1000
print a #output : ['1', '2', 1000, 'sa']
b[2] = 1000
print b #output : TypeError: 'tuple' object does not support item assignment.
Pertanto, il seguente codice non è valido con la tupla, poiché abbiamo tentato di aggiornare una tupla, che non è consentito.
L'elenco è modificabile e le tuple sono immutabili. La principale differenza tra mutabile e immutabile è l'utilizzo della memoria quando si tenta di aggiungere un elemento.
Quando si crea una variabile, viene assegnata parte della memoria fissa alla variabile. Se è un elenco, viene assegnata più memoria di quella effettivamente utilizzata. Ad esempio, se l'attuale assegnazione di memoria è di 100 byte, quando si desidera aggiungere il 101 ° byte, forse verranno assegnati altri 100 byte (in totale 200 byte in questo caso).
Tuttavia, se sai che non aggiungi spesso nuovi elementi, allora dovresti usare le tuple. Tuple assegna esattamente la dimensione della memoria necessaria e quindi risparmia memoria, specialmente quando si utilizzano grandi blocchi di memoria.