Stringhe, liste e tuple (sequenze)

Indice

Definizione di stringa, lista e tupla (sequenze)

Costruzione di una sequenza

Dimensioni di una sequenza

Indicizzazione e accesso agli elementi di una sequenza

Concatenazione di sequenze

Ripetizione dei una sequenza

Scansione degli elementi di una sequenza

Aggiornamento di una lista

Assegnamento multiplo

List comprehension

La funzione enumerate()

Strutture di controllo (selezione e iterazione)

Definizione di stringa, lista e tupla (sequenze)

Stringhe, liste e tuple sono sequenze, cioé oggetti su cui si può iterare i cui elementi sono indicizzati tramire la loro posizione.

Stringa:

  • oggetto immutabile
  • oggetto di tipo str
  • sequenza di caratteri

NOTA BENE: il singolo carattere in Python una stringa di un solo carattere.

Lista:

  • oggetto mutabile
  • oggetto di tipo list
  • sequenza di valori (oggetti) anche di tipo diverso

Tupla:

  • oggetto immutabile
  • oggetto di tipo tuple
  • sequenza di valori (oggetti) anche di tipo diverso

Costruzione di una sequenza

Costruzione di una stringa

  • tramite letterale:
    • sequenza di caratteri racchiusi tra singoli apici '
    • (oppure) sequenza di caratteri racchiusi tra doppi apici "
  • tramite la funzione str()

Costruzione di una stringa tramite letterale

Esempio di letterale con singoli apici:


In [195]:
'ciao'


Out[195]:
'ciao'

Inseririmento nella stringa di singoli apici:


In [196]:
'\'ciao\''


Out[196]:
"'ciao'"

Esempio di letterale con doppi apici:


In [197]:
"ciao"


Out[197]:
'ciao'

Inserimento nella stringa di doppi apici:


In [198]:
"\"ciao\""


Out[198]:
'"ciao"'

Con i singoli apici si possono inserire nella stringa i doppi apici (e viceversa). Ad esempio:


In [199]:
'"ciao"'


Out[199]:
'"ciao"'

In [200]:
"'ciao'"


Out[200]:
"'ciao'"

Inserimento nella stringa del carattere di backslash \:


In [201]:
'\\ciao\\'


Out[201]:
'\\ciao\\'

In [202]:
"\\ciao\\"


Out[202]:
'\\ciao\\'

Inserimento nella stringa del carattere di newline \n:


In [203]:
stringa = 'ciao\n'
print(stringa)


ciao


In [204]:
stringa = "ciao\n"
print(stringa)


ciao

Costruzione della stringa vuota:


In [205]:
''


Out[205]:
''

In [206]:
""


Out[206]:
''

Costruzione di una stringa tramite la funzione str()

Stringa vuota:


In [207]:
str()


Out[207]:
''

Costruzione con letterale stringa:


In [208]:
str("ciao\n")


Out[208]:
'ciao\n'

Costruzione con espressione aritmetica:


In [209]:
str(3+4)


Out[209]:
'7'

Costruzione con espressione di confronto:


In [210]:
str(34 > 0)


Out[210]:
'True'

NOTA BENE: il valore restituito dalla chiamata str(34 >0) è la stringa dei caratteri T, r, u ed e e non il valore True di tipo bool.

Costruzione con sequenza:


In [211]:
str((1,'2'))


Out[211]:
"(1, '2')"

NOTA BENE: il valore restituito dalla chiamata str((1,'2')) è la stringa corrispondente al letterale '(1, '2')' e non la tupla composta dall'intero 1 e dalla stringa dell'unico simbolo di cifra 2.

Costruzione di una lista

  • tramite letterale:
    • sequenza di valori racchiusi tra parentesi quadre [] e separati da virgola
  • tramite la funzione list()

Costruzione di una lista tramite letterale

Lista vuota:


In [212]:
[]


Out[212]:
[]

Lista di un solo valore:


In [213]:
[4]


Out[213]:
[4]

Lista di tre valori dello stesso tipo:


In [214]:
[1, 2, 3]


Out[214]:
[1, 2, 3]

Lista di tre valori di tipo diverso:


In [215]:
[4, 5, '6']


Out[215]:
[4, 5, '6']

Lista di tre valori di tipo diverso di cui il terzo di tipo list (lista annidata):


In [216]:
[7, 8.9, [True,'ciao']]


Out[216]:
[7, 8.9, [True, 'ciao']]

Costruzione di una lista tramite la funzione list()

Lista vuota:


In [217]:
list()


Out[217]:
[]

Costruzione con sequenze:


In [218]:
list('abcdef')


Out[218]:
['a', 'b', 'c', 'd', 'e', 'f']

In [219]:
list([1,2,3])


Out[219]:
[1, 2, 3]

In [220]:
list((1,2,3))


Out[220]:
[1, 2, 3]

Costruzione di una tupla

  • tramite letterale
    • sequenza di valori racchiusi tra parentesi tonde (opzionali) () e separati da virgola
  • tramite la funzione tuple()

Costruzione di una tupla tramite letterale

Tupla vuota:


In [221]:
()


Out[221]:
()

Tupla di un solo valore:


In [222]:
(4,)


Out[222]:
(4,)

NOTA BENE: la virgola è necessaria, in quanto il letterale (4) rappresenta l'intero 4.


In [223]:
(4)


Out[223]:
4

Tupla di tre valori dello stesso tipo:


In [224]:
(1, 2, 3)


Out[224]:
(1, 2, 3)

Tupla di tre valori di tipo diverso:


In [225]:
(4, 5, '6')


Out[225]:
(4, 5, '6')

Tupla di quattro valori di tipo diverso di cui il terzo di tipo list (lista annidata) e il quarto di tipo tuple (tupla annidata):


In [226]:
(7, 8.9, [True,'ciao'], (1,2,3))


Out[226]:
(7, 8.9, [True, 'ciao'], (1, 2, 3))

NOTA BENE: le parentesi tonde sono opzionali.


In [227]:
4,


Out[227]:
(4,)

In [228]:
1, 2, 3


Out[228]:
(1, 2, 3)

In [229]:
4, 5, '6'


Out[229]:
(4, 5, '6')

In [230]:
7, 8.9, [True,'ciao'], (1,2,3)


Out[230]:
(7, 8.9, [True, 'ciao'], (1, 2, 3))

NOTA BENE: le parentesi tonde non possono essere omesse nel caso di tupla vuota.

Costruzione di una tupla tramite la funzione tuple()

Tupla vuota:


In [231]:
tuple()


Out[231]:
()

Costruzione con sequenze:


In [232]:
tuple('abcdef')


Out[232]:
('a', 'b', 'c', 'd', 'e', 'f')

In [233]:
tuple([1, 2, 3])


Out[233]:
(1, 2, 3)

In [234]:
tuple((1, 2, 3))


Out[234]:
(1, 2, 3)

Dimensione di una sequenza

La funzione len() restituisce la dimensione della sequenza passata come argomento.


In [235]:
len('abc')


Out[235]:
3

In [236]:
len([1, 2, 3, 4, 5])


Out[236]:
5

In [237]:
len((1, 2, 3, 4, 5))


Out[237]:
5

Indicizzazione e accesso agli elementi di una sequenza

Indicizzazione degli elementi di una sequenza

Le posizioni degli elementi di una sequenza my_sequence sono indicate tramite:

  • interi positivi da 0 (posizione del primo elemento) a len(my_sequence)-1 (posizione dell'ultimo elemento)
  • (oppure) interi negativi da -1 (posizione dell'ultimo elemento) a -len(my_sequence) (posizione del primo elemento)

Accesso a un elemento di una sequenza

L'espressione:

my_sequence[some_index]

restituisce l'elemento della sequenza my_sequence in posizione some_index.

Esempi di accesso a un carattere di una stringa

Accesso tramite indice positivo:


In [238]:
stringa = 'Hello world!'
stringa[4]


Out[238]:
'o'

NOTA BENE: stringa[4] restituisce un oggetto di tipo str.

Accesso tramite indice negativo:


In [239]:
stringa[-2]


Out[239]:
'd'

Esempi di accesso a un elemento di una lista

Accesso tramite indice positivo:


In [240]:
lista = [1, 2, 3, [4, 5]]
lista[2]


Out[240]:
3

In [241]:
lista[3]


Out[241]:
[4, 5]

Accesso al primo elemento della lista annidata in posizione di indice 3:


In [242]:
lista[3][0]


Out[242]:
4

Accesso tramite indice negativo:


In [243]:
lista[-len(lista)]


Out[243]:
1

Esempi di accesso a un elemento di una tupla

Accesso tramite indice positivo:


In [244]:
tupla = (1, 2, 3, 4)
tupla[2]


Out[244]:
3

Accesso tramite indice negativo:


In [245]:
tupla[-1]


Out[245]:
4

Accesso a elementi consecutivi di una sequenza (slicing)

L'epressione:

my_sequence[start_index:end_index]

restituisce gli elementi della sequenza my_sequence da quello in posizione start_index fino a quello in posizione end_index-1.

In particolare:

  • my_sequence[start_index:] restituisce gli elementi da quello in posizione start_index fino all'ultimo
  • my_sequence[:end_index] restituisce gli elementi dal primo fino a quello in posizione end_index-1
  • my_sequence[:] restituisce tutti gli elementi dal primo fino all'ultimo

NOTA BENE: l'oggetto restituito è sempre dello stesso tipo di my_sequence.

Esempi di accesso a caratteri consecutivi di una stringa (sottostringa):


In [246]:
stringa = 'Hello world!'
stringa[2:7]


Out[246]:
'llo w'

In [247]:
stringa = 'Hello world!'
stringa[-10:-5]


Out[247]:
'llo w'

In [248]:
stringa = 'Hello world!'
stringa[:]


Out[248]:
'Hello world!'

Esempi di accesso a elementi consecutivi di una lista (sottolista):


In [249]:
lista = [1, 2, 3, 4, 5, 6]
lista[2:4]


Out[249]:
[3, 4]

In [250]:
lista = [1, 2, 3, 4, 5, 6]
lista[2:]


Out[250]:
[3, 4, 5, 6]

In [251]:
lista = [1, 2, 3, 4, 5, 6]
lista[:4]


Out[251]:
[1, 2, 3, 4]

Esempio di accesso a elementi consecutivi di una tupla (sottotupla):


In [252]:
tupla = (1, 2, 3, 4, 5, 6)
tupla[2:5]


Out[252]:
(3, 4, 5)

Accesso a elementi non consecutivi di una sequenza (slicing)

L'epressione:

my_sequence[start_index:end_index:step]

restituisce gli elementi della sequenza my_sequence da quello in posizione start_index fino a quello in posizione end_index-1 considerando il passo step (se step è uguale a 1, allora gli elementi saranno consecutivi).

NOTA BENE: l'oggetto restituito è sempre dello stesso tipo di my_sequence.


In [253]:
stringa = 'Hello world!'
stringa[2:7:2]


Out[253]:
'low'

Lo slicing con passo può essere utilizzato per invertire una stringa:


In [254]:
stringa = 'Hello world!'
stringa[-1:-len(stringa)-1:-1]


Out[254]:
'!dlrow olleH'

In [255]:
stringa = 'Hello world!'
stringa[::-1]


Out[255]:
'!dlrow olleH'

In [256]:
lista = [1, 2, 3, 4, 5, 6, 7, 8, 9]
lista[2:7:3]


Out[256]:
[3, 6]

Lo slicing con passo può essere utilizzato per invertire una lista (o una tupla):


In [257]:
lista = [1, 2, 3, 4, 5, 6, 7, 8, 9]
lista[::-1]


Out[257]:
[9, 8, 7, 6, 5, 4, 3, 2, 1]

Concatenazione di sequenze

L'espressione:

my_sequence1 + my_sequence2 + ... + my_sequenceN

restituisce la concatenazione di N sequenze dello stesso tipo (in un oggetto dello stesso tipo).


In [258]:
'ciao' + ' mondo!'


Out[258]:
'ciao mondo!'

In [259]:
[1, 2] + [3, 4, 5]


Out[259]:
[1, 2, 3, 4, 5]

In [260]:
('a', 'a') + (1, 1)


Out[260]:
('a', 'a', 1, 1)

Ripetizione di una sequenza

L'espressione:

my_sequence * times

restituisce la ripetizione di my_sequence per times volte (in un oggetto dello stesso tipo).


In [261]:
'ciao' * 3


Out[261]:
'ciaociaociao'

In [262]:
[3, 4, 5] * 2


Out[262]:
[3, 4, 5, 3, 4, 5]

In [263]:
('a', 'b') * 6


Out[263]:
('a', 'b', 'a', 'b', 'a', 'b', 'a', 'b', 'a', 'b', 'a', 'b')

Scansione degli elementi una sequenza

Operatore in

L'espressione:

my_element in my_sequence

restituisce il valore True (di tipo bool) se l'elemento my_element è presente nella sequenza my_sequence.

NOTA BENE: nel caso di stringhe l'operatore in testa in generale la presenza di my_element come sottostringa; nel caso invece di liste e tuple testa la presenza di my_element come valore.


In [264]:
'H' in 'Hello world!'


Out[264]:
True

In [265]:
'world' in 'Hello world!'


Out[265]:
True

In [266]:
'ca' in [1, 2, 'acaa', 10.5]


Out[266]:
False

In [267]:
2 in ()


Out[267]:
False

Scansione con operatore in

Sintassi di scansione di una sequenza:

for element in my_sequence:
    do_something

dove:

  • my_sequence è la sequenza i cui elementi sono da considerare uno dopo l'altro dal primo all'ultimo
  • element è la variabile che durante la scansione assume il valore dell'elemento di volta in volta considerato
  • do_something sono le istruzioni da eseguire per ogni elemento considerato

Regole:

  • le istruzioni in do_something devono essere indentate 4 volte rispetto alla riga di intestazione
  • una riga vuota è necessaria dopo l'ultima istruzione

In [268]:
for c in 'world':
    print(c)


w
o
r
l
d

In [269]:
for v in [3, 45.6, 'ciao']:
    print(v)


3
45.6
ciao

In [270]:
for v in 3, 45.6, 'ciao':
    print(v)


3
45.6
ciao

Aggiornamento di una lista

Aggiornamento di un elemento di una lista

L'istruzione:

my_list[some_index] = new_value

sostituisce l'elemento della lista my_list in posizione some_index con il nuovo valore new_value.


In [271]:
lista = [1, 2, 3, 4, 5, 6, 7]
lista[3] = 0
lista


Out[271]:
[1, 2, 3, 0, 5, 6, 7]

Aggiornamento di una sottolista

L'istruzione:

my_list[start_index:end_index] = new_list

sostituisce la sottolista di my_list ottenuta tramite slicing con la lista new_list.

Sostituzione di tre elementi consecutivi:


In [272]:
lista = [1, 2, 3, 4, 5, 6, 7]
lista[3:6] = ['*', '*', '*']
lista


Out[272]:
[1, 2, 3, '*', '*', '*', 7]

Cancellazione di tre elementi consecutivi:


In [273]:
lista = [1, 2, 3, 4, 5, 6, 7]
lista[3:6] = []
lista


Out[273]:
[1, 2, 3, 7]

Inserimento di tre elementi consecutivi:


In [274]:
lista = [1, 2, 3, 4, 5, 6, 7]
lista[1:1] = ['*', '*', '*']
lista


Out[274]:
[1, '*', '*', '*', 2, 3, 4, 5, 6, 7]

Aggiunta in coda di tre elementi consecutivi:


In [275]:
lista = [1, 2, 3, 4, 5, 6, 7]
lista[len(lista):] = ['*', '*', '*']
lista


Out[275]:
[1, 2, 3, 4, 5, 6, 7, '*', '*', '*']

Aggiunta in testa di tre elementi consecutivi:


In [276]:
lista = [1, 2, 3, 4, 5, 6, 7]
lista[0:0] = ['*', '*', '*']
lista


Out[276]:
['*', '*', '*', 1, 2, 3, 4, 5, 6, 7]

NOTA BENE: il mutamento di una lista non è da confondere con il suo riassegnamento.

Mutamento: il riferimento all'oggetto non viene alterato.


In [305]:
lista = [1, 2, 3, 4, 5, 6, 7]
lista[1:3] = [8]
lista[0] = 'ciao'
lista


Out[305]:
['ciao', 8, 4, 5, 6, 7]

Riassegnamento: viene creato un nuovo riferimento.


In [306]:
lista = [0, 0.0, False]
lista


Out[306]:
[0, 0.0, False]

NOTA BENE: attenzione a quando si usa lo slicing con il passo per aggiornare una lista. Nell'esempio seguente l'operazione di slicing "estrae" gli elementi in posizione di indice positivo pari a partire dal primo. Siccome per la lista costruita gli elementi estratti sono quattro, nell'aggiornamento deve essere assegnata una lista di esattamente quattro elementi.

Estrazione degli elementi in posizione di indice pari:


In [279]:
lista = [1, 2, 3, 4, 5, 6, 7]
lista[0:len(lista):2]


Out[279]:
[1, 3, 5, 7]

Aggiornamento degli elementi in posizione di indice pari:


In [280]:
lista[0:len(lista):2] = [0, 0, 0, 0]
lista


Out[280]:
[0, 2, 0, 4, 0, 6, 0]

Cancellazione in una lista con l'operatore del

L'istruzione:

del my_list[some_index]

rimuove dalla lista my_list l'elemento in posizione di indice some_index.


In [281]:
lista = [1, 2, 3, 4]
del lista[2]
lista


Out[281]:
[1, 2, 4]

L'istruzione:

del my_list[start_index:end_index:step]

rimuove dalla lista my_list gli elementi prodotti dall'operazione di slicing (il passo step è opzionale).


In [282]:
lista = [1, 2, 3, 4]
del lista[2]
lista


Out[282]:
[1, 2, 4]

In [283]:
lista = [1, 2, 3, 4, 5, 6, 7, 8]
del lista[2:5]
lista


Out[283]:
[1, 2, 6, 7, 8]

In [284]:
lista = [1, 2, 3, 4, 5, 6, 7, 8]
del lista[::2]
lista


Out[284]:
[2, 4, 6, 8]

Assegnamento multiplo

L'istruzione (in cui le parentesi tonde sono opzionali):

(my_var1, my_var2, ..., my_varN) = my_sequence

assegna alle N variabili specificate nella tupla a sinistra i valori (presi nello stesso ordine) della sequenza my_sequence specificata a destra.

NOTA BENE: la sequenza my_sequence deve avere dimensione pari a N.


In [285]:
v1, v2, v3, v4 = '1234'

In [286]:
v1


Out[286]:
'1'

In [287]:
v2


Out[287]:
'2'

In [288]:
v3


Out[288]:
'3'

In [289]:
v4


Out[289]:
'4'

In [290]:
v1, v2, v3, v4 = [1, 2, 3, 4]

In [291]:
v1


Out[291]:
1

In [292]:
v2


Out[292]:
2

In [293]:
v3


Out[293]:
3

In [294]:
v4


Out[294]:
4

In [311]:
v1, v2, v3, v4 = 1, 2, 3, 4

In [312]:
v1


Out[312]:
1

In [313]:
v2


Out[313]:
2

In [314]:
v3


Out[314]:
3

In [315]:
v4


Out[315]:
4

Assegnamento di una tupla di variabili:


In [316]:
v1, v2 = v2, v1

In [317]:
v1


Out[317]:
2

In [318]:
v2


Out[318]:
1

Esempio di assegnamento multiplo utilizzato per scandire una lista di tuple di due interi:


In [297]:
for (v1, v2) in [(1, 2), (3, 4), (5, 6)]:
    print(str(v1)+' '+str(v2))


1 2
3 4
5 6

Strutture di controllo di selezione

List comprehension

La list comprehension permette di creare liste in maniera molto concisa.

L'istruzione:

[some_expression for e1 in my_sequence1 for e2 in my_sequence2 ... for eN in my_sequenceN if condition]

equivale a scrivere:

for e1 in my_sequence1:
    for e2 in my_sequence2:
        ...
            for eN in my_sequenceN:
                if condition
                    some_expression

con la differenza che i valori restituiti da some_expression vengono restituiti in un oggetto di tipo list.


In [298]:
[i+1 for i in [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] if i % 2 == 0]


Out[298]:
[3, 5, 7, 9, 11]

In [299]:
[c + '1' for c in 'ciao']


Out[299]:
['c1', 'i1', 'a1', 'o1']

In [300]:
[c1 + str(i) + str(c2) for c1 in 'ciao' for i in [1, 2, 3, 4] for c2 in ('a', 'b', 'c')]


Out[300]:
['c1a',
 'c1b',
 'c1c',
 'c2a',
 'c2b',
 'c2c',
 'c3a',
 'c3b',
 'c3c',
 'c4a',
 'c4b',
 'c4c',
 'i1a',
 'i1b',
 'i1c',
 'i2a',
 'i2b',
 'i2c',
 'i3a',
 'i3b',
 'i3c',
 'i4a',
 'i4b',
 'i4c',
 'a1a',
 'a1b',
 'a1c',
 'a2a',
 'a2b',
 'a2c',
 'a3a',
 'a3b',
 'a3c',
 'a4a',
 'a4b',
 'a4c',
 'o1a',
 'o1b',
 'o1c',
 'o2a',
 'o2b',
 'o2c',
 'o3a',
 'o3b',
 'o3c',
 'o4a',
 'o4b',
 'o4c']

La funzione enumerate()

La funzione enumerate():

enumerate(my_sequence, start)

restituisce gli elementi di my_sequence, ciasuno con il suo indice di posizione, in tuple di dimensione due. L'indice di posizione prima di essere restituito viene incrementato di start (che se omesso vale 0 di default).

L'oggetto restituito è di tipo enumerate e può essere interrogato all'occorrenza per restuire le tuple.


In [301]:
enum = enumerate('ciao', 1)
enum


Out[301]:
<enumerate at 0x10d81ffc0>

Basta ad esempio effettuare una scansione dell'oggetto per ottenere le sue tuple.

La seguente istruzione produce la lista (oggetto di tipo list) delle tuple dell'oggetto enum:


In [302]:
[t for t in enum]


Out[302]:
[(1, 'c'), (2, 'i'), (3, 'a'), (4, 'o')]

La seguente istruzione produce la lista (oggetto di tipo list) delle tuple con indice pari dell'oggetto enum:


In [2]:
enum = enumerate('ciao', 1)

[(i , e) for (i, e) in enum if i % 2 == 0]


Out[2]:
[(2, 'i'), (4, 'o')]

NOTA BENE: si è dovuto ricreare l'oggetto per poter produrre nuovamente le sue tuple. Una nuova scansione produrrebbe in questo caso una lista vuota


In [3]:
[(i , e) for (i, e) in enum if i % 2 == 0]


Out[3]:
[]

Strutture di controllo (selezione e iterazione)

Selezione

Selezione if

if condition:
    do_something

Se condition è un valore vero allora le istruzioni do_something vengono eseguite.

Selezione alternativa if-else

if condition:
    do_something-if
else:
    do_something-else

Se condition è un valore vero allora le istruzioni do_something-if vengono eseguite, altrimenti vengono eseguite le istruzioni do_something-else.

Selezione in serie if-elif-else

if condition1:
    do_something1
elif condition2:
    do_something2
elif condition3:
    do_something3
...
else:
    do_something-else

vengono eseguite le istruzioni do_something della prima condizione che risulta essere vera. Altrimenti vengono eseguite le istruzioni do_something-else.

NOTA BENE: i costrutti di selezione possono essere annidati l'uno nell'altro.

Iterazione

Ciclo while

while condition:
    do-something