Unes dades (o "data") és un conjunt de valors que estan relacionats i que es gestionen com un conjunt.
Introducció
Hi ha variables que estan estretament relacionades entre elles.
Per exemple:
name = "Eva"surname = "Vilaregut"age = 19Per agrupar aquestes dades en un sóla variable i tractar-les de forma conjunta tens tres opcions que estudiem a continuació.
Diccionari
Els diccionaris són estructures flexibles perquè pots afegir i eliminar atributs.
El concepte de diccionari ve del diccionari físic:

A continuació crea el diccionari eva:
eva = { "name": "Eva", "surname": "Vilaregut", "age": 19}print(eva){'name': 'Eva', 'surname': 'Vilaregut', 'age': 19}D’aquesta manera tens totes les dades agrupades.
Si vols accedir a l’edat de l’eva, pots utilitzar el nom de l’atribut (o “key”) age:
assert eva["age"] == 19És la mateixa forma d’accedir que fas amb una Llista.
eva = ["Eva", "Vilaregut", 19]assert eva[2] == 19Però en lloc de fer-ho per posició ho fas per “key”.
I com també passa amb una llista, si la “key” no existeix …
eva["height"]Es produeix un error:
eva["height"] ~~~^^^^^^^^^^KeyError: 'height'Pots modificar l’edat de l’eva:
eva["age"] = 27print(eva){'name': 'Eva', 'surname': 'Vilaregut', 'age': 27}Amb una llista es semblant:
eva = ["Eva", "Vilaregut", 19]
eva[2] = 27print(eva)['Eva', 'Vilaregut', 27]Al principi hem dit que un diccionari és una estructura flexible.
Per tant, pots afegir un atribut height a leva:
eva["height"] = 162print(eva){'name': 'Eva', 'surname': 'Vilaregut', 'age': 19, 'height': 162}Amb una llista es semblant:
eva = ["Eva", "Vilaregut", 19]
eva.append(162)print(eva)['Eva', 'Vilaregut', 19, 162]O eliminar l’atribut edatde l’eva:
del eva["edat"]print(eva){'name': 'Eva', 'surname': 'Vilaregut', 'height': 162}Crea un “dict” d’un cotxe amb els atributs brand, model i year.
car = {"brand": "Ford", "model": "Mustang", "year": 1964}Per accedir de manera segura a un “dict” pots utilitzar un accés condicional amb if:
eva = {"nom": "Eva", "cognom": "Vilaregut", "sexe": "Dona", "edat": 19, "altura": 162}
if "edat" in eva: assert eva["edat"] > 10També pots utilitzar un bucle for per iterar sobre les “keys” de l’eva:
eva = {"nom": "Eva", "cognom": "Vilaregut", "sexe": "Dona", "edat": 19, "altura": 162}
[print(f"{key}: {eva[key]}") for key in eva.keys()]Activitat: Llista
A continuació tens una llista de persones:
persons = [ {"nom": "Eva", "cognom": "Vilaregut", "sexe": "Dona", "edat": 19, "altura": 162}, {"nom": "Joan", "cognom": "Sales", "sexe": "Home", "edat": 25, "altura": 173}, {"nom": "Raquel", "cognom": "Viñales", "sexe": "Dona", "edat": 12, "altura": 123}, {"nom": "Esther", "cognom": "Parra", "sexe": "Dona", "edat": 33, "altura": 178}, {"nom": "Miquel", "cognom": "Amorós", "sexe": "Home", "edat": 56, "altura": 166}, {"nom": "Laura", "cognom": "Casademunt", "sexe": "Dona", "edat": 41, "altura": 182},]Quina és l’altura màxima?
Aquí tens dues solucions (una amb for i l’altre més avançada, amb list comprehension).
max = 0 for p in persons: if p["altura"] > max: max = p["altura"]
# Mostrem per verificar el resultat esperat. # print(max) assert max == 182result = max([p["altura"] for p in persons])assert result == 182Quina és la mitja d’edat?
Com abans, tens dues solucions (una amb for i l’altre més avançada, amb list comprehension).
num_persons = 0 sum_persons = 0 for p in persons: num_persons += 1 sum_persons += p['edat']
mitjana = sum_persons / num_persons print(mitjana) assert mitjana == 31result = sum([p["edat"] for p in persons]) / len(persons)assert result == 31Quina és la persona més alta?
result = persons[0]for person in persons[1:]: if person["edat"] > result["edat"]: result = person
assert result["nom"] == "Laura"Imprimeix per pantalla el nom i el cognom de totes les dones:
Eva VilaregutRaquel ViñalesEsther ParraLaura CasademuntTens dues solucions:
[print(f"{person["nom"]} {person["cognom"]}") for person in persons if person["sexe"] == "Dona"][print(f"{person["nom"]} {person["cognom"]}") for person in persons if person["sexe"] == "Dona"]Dataclass
Un dataclass és una estructura fixa.
D’aquesta manera pots estar segur que un atribut existeix, a més que el codi és molt més eficient.
Un dataclass es defineix amb un class anotada amb @dataclass:
from dataclasses import dataclass
@dataclassclass Country: name: str size: intA Python - Objecte ja estudiarem exactament que és una classe.
A continuació crea un pais:
spain = Country("Spain", 504_030)print(spain)Country(name='Spain', size=504030)Però no pots crear un pais amb la seva capital:
france = Country("France", "Paris", 675_417) france = Country("France", "Paris", 675_417)TypeError: Country.__init__() takes 3 positional arguments but 4 were givenI també molt important, la IDE t’avisa de que el dataclass Country només té tres atributs:

Modifica el dataclass Country per tal que tingui un atribut capital.
from dataclasses import dataclass
@dataclassclass Country: name: str capital: str size: intCrea un dataclass france
france = Country("France", 675_417)print(france)Country(name='France', capital='Paris', size=675417)Continua llegint:
Activitats
A continuació tens una llista de paisos:
countries = [ Country("France", 675_417), Country("Portugal", 92_152), Country("Espanya", 504_030)]Digues quin és el país més gran?
result = countries[0]for country in countries[1:]: if country.size > result.size: result = country
assert result.name == "France"Tupla
Una tupla és una seqüència de mida fixa:
>>> t = ("a","b","c")>>> t[0]'a'>>> t[0:2]('a', 'b')>>> t[3]Traceback (most recent call last): File "<stdin>", line 1, in <module>IndexError: tuple index out of rangeÉs molt més eficient que un dict.
No necessites declarar una class de tipus @dataclass.
TODO
- Python’s tuple Data Type: A Deep Dive With Examples
- Data Classes vs typing.NamedTuple primary use cases
- Python Data Classes vs Named Tuples: Differences You Should Know
Activitat
A continuació tens una llista de paisos:
countries = [ ("France", 675_417), ("Portugal", 92_152), ("Espanya", 504_030)]1. Digues quin és el país més gran?
result = countries[0]for country in countries[1:]: if country[1] > result[1]: result = country
assert result[0] == "France"