Python - Dades

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 = 19

Per 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
Nota

És la mateixa forma d’accedir que fas amb una Llista.

eva = ["Eva", "Vilaregut", 19]
assert eva[2] == 19

Però 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:

Terminal window
eva["height"]
~~~^^^^^^^^^^
KeyError: 'height'

Pots modificar l’edat de l’eva:

Terminal window
eva["age"] = 27
print(eva)
{'name': 'Eva', 'surname': 'Vilaregut', 'age': 27}
Nota

Amb una llista es semblant:

eva = ["Eva", "Vilaregut", 19]
eva[2] = 27
print(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"] = 162
print(eva)
{'name': 'Eva', 'surname': 'Vilaregut', 'age': 19, 'height': 162}
Nota

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}
Activitat

Crea un “dict” d’un cotxe amb els atributs brand, model i year.

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"] > 10

També 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},
]
Activitat

Quina és l’altura màxima?

Aquí tens dues solucions (una amb for i l’altre més avançada, amb list comprehension).

Activitat

Quina és la mitja d’edat?

Com abans, tens dues solucions (una amb for i l’altre més avançada, amb list comprehension).

Activitat

Quina és la persona més alta?

Activitat

Imprimeix per pantalla el nom i el cognom de totes les dones:

Terminal window
Eva Vilaregut
Raquel Viñales
Esther Parra
Laura Casademunt

Tens dues solucions:


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
@dataclass
class Country:
name: str
size: int
Nota

A 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)
Terminal window
france = Country("France", "Paris", 675_417)
TypeError: Country.__init__() takes 3 positional arguments but 4 were given

I també molt important, la IDE t’avisa de que el dataclass Country només té tres atributs:

Activitat

Modifica el dataclass Country per tal que tingui un atribut capital.

Crea un dataclass france

Continua llegint:

Activitats

A continuació tens una llista de paisos:

countries = [
Country("France", 675_417),
Country("Portugal", 92_152),
Country("Espanya", 504_030)
]
Activitat

Digues quin és el país més gran?


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

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?