Llistes i tuples

Què són?

  • Les llistes són objectes de tipus list i les tuples de tipus tuple

  • Les llistes, les tuples i els strings són (tipus) seqüències, vegeu python:typesseq

  • Les seqüències contenen referències als seus elements als quals s’hi pot accedir individualment mitjançant un índex.

Com es construeixen?

  • En un valor literal de tipus seqüència

    • els elements es separen amb comes i

      • s’envolten entre claudàtors, si és una llista

      • no s’envolten o s’envolten entre parèntesis si és una tupla

    llistes

    tuples

    [10, 20, 30, 40]
    
    ["spam", "bungee", "swallow"]
    ["hello", 2.0, 5, [10, 20]]
    [5]
    
    10, 20, 30, 40
    (10, 20, 30, 40)
    "spam", "bungee", "swallow"
    "hello", 2.0, 5, [10, 20]
    (5,)
    
  • La seqüència buida no té elements (o la longitud és zero)

    llistes

    tuples

    []
    list()
    
    ()
    tuple()
    
  • Una variable es pot referir a una llista o a una tupla (assignació)

    >>> s = [1, -21, 'a']
    >>> t = 'x', -7
    

Desempaquetar una seqüència

  • Podem desempaquetar qualsevol seqüència

    >>> t = 'x', -7          # contruim la tupla t
    >>> lletra, numero = t   # desempaquetem t
    >>> lletra
    'x'
    >>> numero
    -7
    
    >>> s = [1, -21, 'a']    # construim la llista s
    >>> a, b, c = s          # desempaquetem s
    >>> a
    1
    >>> b
    -21
    >>> c
    'a'
    
  • L’assignació múltiple

    • crea una tupla a partir de les expressions separades per comes de la dreta

    • desempaqueta el tuple en les variables de l’esquerra

    >>> x, y = 0, 1
    
  • Les funcions sempre retornen un valor que pot ser una tupla

    >>> def f(a, b, c):
    ...     return a + b*c, a - b*c   # construir una tupla i retornar-la
    
    >>> r, s = f(3, -2, 5)            # desempaquetar
    

Operacions comunes als tipus seqüència

Vegeu python:typesseq-common

Pertinença a una seqüència

  • Un element pertany (in) o no pertany not in a la seqüència

    Avís

    Als strings, in a més de comprovar la pertinença d’un caràcter a l'string, també permet comprovar si el substring de l’esquerra apareix a l'string de la dreta

Comparacions

  • Operadors: ==, !=, <, >, <=, >=

  • Les comparacions es fan en ordre lexicogràfic

    >>> (1, 'A') == (1, 'A')
    True
    >>> [1, 3] < [1, 2, 3]
    False
    >>> [1, 3] >= [1, 2, 3]
    True
    

Conversió de tipus

  • Convertir una llista en tupla

    >>> a = [3, (1.5, 2.1, 3.3e4), 'abc', [9, 2]]
    >>> b = tuple(a)
    >>> b
    (3, (1.5, 2.1, 33000.0), 'abc', [9, 2])
    
  • Convertir una tupla en llista

    >>> list(b)
    [3, (1.5, 2.1, 33000.0), 'abc', [9, 2]]
    

Mutabilitat

  • Un objecte és mutable si pot canviar el seu valor. Altrament és immutable

  • Els strings i les tuples són immutables

  • Les llistes són mutables

Operacions sobre seqüències mutables

Vegeu typesseq-mutable

  • Les llistes són seqüències mutables

  • Operador d’accés usat a l’esquerra d’una assignació per a substituir un element

    >>> fruit = ["banana", "apple", "quince"]
    >>> fruit[0] = "pear"
    >>> fruit[2] = "orange"
    >>> fruit
    ['pear', 'apple', 'orange']
    
  • Operador llesca usat a l’esquerra d’una assignació per a substituir una llesca

    >>> a_list = ["a", "b", "c", "d", "e", "f"]
    >>> a_list[1:3] = ["x", "y"]
    >>> a_list
    ['a', 'x', 'y', 'd', 'e', 'f']
    
  • Operador llesca usat a l’esquerra d’una assignació per a esborrar una llesca

    >>> a_list = ["a", "b", "c", "d", "e", "f"]
    >>> a_list[1:3] = []
    >>> a_list
    ['a', 'd', 'e', 'f']
    
  • Operador llesca usat a l’esquerra d’una assignació per a inserir elements

    >>> a_list = ["a", "d", "f"]
    >>> a_list[1:1] = ["b", "c"]
    >>> a_list
    ['a', 'b', 'c', 'd', 'f']
    >>> a_list[4:4] = ["e"]
    >>> a_list
    ['a', 'b', 'c', 'd', 'e', 'f']
    

Esborrar elements

  • Sentència del per a esborrar un element

    >>> a = ["one", "two", "three"]
    >>> del a[1]
    >>> a
    ['one', 'three']
    
  • Sentència del per a esborrar una llesca

    >>> a_list = ["a", "b", "c", "d", "e", "f"]
    >>> del a_list[1:5]
    >>> a_list
    ['a', 'f']
    

Mètodes modificadors

  • Els mètodes formen part dels objectes i s’invoquen (es criden) aplicant l’operador punt (.) després de l’objecte seguit pel nom del mètode

  • Els mètodes modificadors de seqüències mutables són

    • append() afegeix un element al final de la llista

    • reverse() reordena els elements de la llista en ordre invers

    • insert(), extend() i remove()

Generar seqüències

  • Generar llistes a partir dels elements: [] i append()

    >>> r = []
    >>> r
    []
    >>> r.append(8)
    >>> r
    [8]
    >>> r.append(-3)
    >>> r
    [8, -3]
    >>> r.append(5)
    >>> r
    [8, -3, 5]
    
  • Per generar tuples a partir dels elements cal generar una llista i convertir-la a tupla

    >>> t = tuple(r)
    >>> t
    (8, -3, 5)
    

Funcions i funcions modificadores

  • Funció modificadora: funció que modifica algun dels seus paràmetres

    Vegeu l’exemple al Python tutor

  • Funció: funció que no modifica cap dels seus paràmetres

  • Les funcions retornen un valor que només depèn dels seus paràmetres

Còpia d’objectes

  • Cal copiar un objecte mutable quan volem canviar el seu valor, però també conservar l’antic

  • Copiar objectes és complicat: cal decidir la profunditat de la còpia

  • Profunditat de la còpia d’un objecte

    • còpia superficial: nou objecte amb les mateixes referències que l’original

    • còpia profunda: nou objecte amb còpies (recursives) de les referències de l’original

  • L’operador is permet saber si dues expressions s’avaluen al mateix objecte

    >>> a = 3
    >>> b = 5
    >>> a is b
    False
    >>> c = a
    >>> a is c
    True
    
  • Còpia superficial de llistes amb el mètode copy()

    >>> l1 = [[1, 2, [3]], 4, [5, 6]]
    >>> l2 = l1.copy()
    >>> l2 is l1
    False
    >>> l2 == l1
    True
    >>> l1[0] is l2[0]
    True
    

    Vegeu l’exemple al Python Tutor

  • Còpia superficial de llistes amb llesques

    >>> l1 = [[1, 2, [3]], 4, [5, 6]]
    >>> l2 = l1[:]
    >>> l2 is l1
    False
    >>> l2 == l1
    True
    >>> l1[0] is l2[0]
    True