Python: Tuple

Le tuple sono liste immutabili.

Per definire una tupla uso le parentesi tonde:

partners = ("BIOGRID:112315", "BIOGRID:108607")

Esempio. Se voglio creare una tupla con un solo elemento (puo’ capitare…) devo ricordarmi di usare la virgola, oltre alle parentesi tonde:

tupla = (0,)
print(tupla)
print(type(tupla))
print(len(tupla))

non_tupla = (0)
print(non_tupla)
print(type(non_tupla))

Come si vede, non_tupla e’ un intero, 0.

Operazioni

Ritorna Operatore Significato
int len(tuple) Restituisce la lunghezza della tuple
tuple tuple + tuple Concatena le due tuple
tuple tuple * int Replica la tupla
bool object in tuple Contolla se un oggetto arbitrario appare nella tupla
tuple tuple[int:int] Estrae una sotto-tupla

Le tuple supportanto tutti gli operatori delle stringhe e delle liste, tranne l’assegnamento.


Esempio. Creo una tupla con elementi misti:

proteina = ("2B0Q", "phosphotransferase", "PF03881")

che contiene informazioni su una proteina. Posso accedere ai vari elementi come farei con una lista:

id_proteina = proteina[0]
print(id_proteina)

nome_proteina = proteina[1]
print(nome_proteina)

Pero’ non posso modificare la tupla:

>>> proteina[0] = "1A3A"
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'tuple' object does not support item assignment

Esempio. Proprio come le liste e gli intervalli, posso usare le tuple come input ad una list comprehension:

tripla = (1, 2, 3)

risultato = [2*numero for numero in tripla]
print(risultato)
print(type(risultato))

Il risultato di una list comprehension e’ comunque una lista.


Metodi

Ritorna Metodo Significato
int tuple.index(object) Restituisce la posizione di object.
int tuple.count(object) Conta il numero di ripetizioni di un valore

Conversione Lista-Tupla

Per convertire tra liste e tuple uso tuple() e list():

lista = list(range(10))

tupla = tuple(lista)
print(tupla, type(tupla))

lista_2 = list(tupla)
print(lista_2, type(lista_2))

Ne segue che se proprio voglio “modificare” una tupla posso scrivere:

tupla = ("sono", "una", "tupla")
print(tupla)

copia = list(tupla)
copia.insert(2, "bella")
tupla = tuple(copia)
print(tupla)

In realta’ quello che ottengo e’ una nuova tupla che contiene gli elementi della vecchia tupla in aggiunta a …

Esercizi

  1. Creare:

    1. Una tupla di due interi di valore 0 e 1.

    2. Una tupla di due stringhe, "una" e "tupla".

    3. Una tupla di un solo elemento, 0.

      Hint: ci sono due modi di farlo: usare la sintassi vista all’inzio del capitolo, oppure usare la conversione lista-tupla.

    4. Una tupla di cento elementi: i numeri interi da 0 a 99.

      Hint: posso usare (indirettamente) range()?

    5. Una tupla con due elementi: la lista degli interi da 0 a 49 e la lista degli interi da 50 a 99.

    6. Una tupla con due elementi: la tupla degli interi da 0 a 49 e la tupla degli interi da 50 a 99.

  2. Date l = [0, 1, 2] e t = (0, 1, 2), che differenza c’e’ tra:

    1. Primo caso:

      x = l
      x[0] = 100
      
    2. Secondo caso:

      x = t
      x[0] = 100
      
  3. Data la tupla:

    tupla = (0, 1, 2, [3, 4, 5], 6, 7, 8)
    
    1. Di che tipo e’ il primo elemento della tupla? Quanto vale?
    2. Di che tipo e’ il quarto elemento della tupla? Quanto vale?
    3. Quanti elementi contiene la tupla?
    4. Quanti elementi contiene la lista contenuta nella tupla?
    5. Cambiare l’ultimo elemento della lista contenuta in tupla in "ultimo".
    6. Cambiare l’ultimo elemento di tupla in "ultimo". (Si puo’ fare?)

Soluzioni

  1. Soluzioni:

    coppia_di_interi = (0, 1)
    print(type(coppia_di_interi))            # tuple
    
    
    coppia_di_stringhe = ("una", "tupla")
    print(type(coppia_di_stringhe))          # tuple
    
    
    un_solo_elemento = (0,)
    print(type(un_solo_elemento))            # tuple
    print(len(un_solo_elemento))             # 1
    
    un_solo_elemento_alt = tuple([0])
    print(type(un_solo_elemento_alt))        # tuple
    print(len(un_solo_elemento_alt))         # 1
    
    sbagliato = (0)
    print(type(sbagliato))                   # int
    print(len(sbagliato))                    # errore!
    
    
    cento_elementi = tuple(range(100))
    print(type(cento_elementi))              # tuple
    
    
    coppia_di_liste = (range(50), range(50, 100))
    print(type(coppia_di_liste))
    print(type(coppia_di_liste[0]))
    
    
    coppia_di_tuple = (tuple(range(50)), tuple(range(50, 100)))
    print(type(coppia_di_tuple))
    print(type(coppia_di_tuple[0]))
    
  2. Soluzioni:

    l = [0, 1, 2]
    t = (0, 1, 2)
    
    # x si riferisce ad una lista, il codice sostituisce
    # il primo elemento con 100
    x = l
    x[0] = 100
    
    # x ora si riferisce ad una tupla, che e' immutabile:
    # non posso sostituire i suoi elementi, Python da'
    # errore
    x = t
    x[0] = 100                          # errore!
    
  3. Soluzioni:

    tupla = (0, 1, 2, [3, 4, 5], 6, 7, 8)
    
    print(tupla[0])                      # 0
    print(type(tupla[0]))                # int
    
    print(tupla[3])                      # [3, 4, 5]
    print(type(tupla[3]))                # list
    
    print(len(tupla))                    # 9
    
    print(len(tupla[3]))                 # 3
    
    tupla[3][-1] = "ultimo"
    print(tupla)
    # ebbene lo posso fare! ho "modificato" la
    # tupla modificando la lista contenuta
    # in essa.
    
    tupla[-1] = "ultimo"                # errore!
    # non posso modificare la tupla "direttamente"
    # e' un oggetto immutabile