Type to search…

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:

python
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:

![](dictionary.png)

A continuació crea el diccionari eva:

python
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:

python
assert eva["age"] == 19
Note

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

python
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 …

python
eva["height"]

Es produeix un error:

shell
    eva["height"]
    ~~~^^^^^^^^^^
KeyError: 'height'

Pots modificar l’edat de l’eva:

shell
eva["age"] = 27
print(eva)
{'name': 'Eva', 'surname': 'Vilaregut', 'age': 27}
Note

Amb una llista es semblant:

python
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:

python
eva["height"] = 162
print(eva)
{'name': 'Eva', 'surname': 'Vilaregut', 'age': 19, 'height': 162}
Note

Amb una llista es semblant:

python
eva = ["Eva", "Vilaregut", 19]

eva.append(162)
print(eva)
['Eva', 'Vilaregut', 19, 162]

O eliminar l’atribut edatde l’eva:

python
del eva["edat"]
print(eva)
{'name': 'Eva', 'surname': 'Vilaregut', 'height': 162}
Task

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

Show solution
python
car = {"brand": "Ford", "model": "Mustang", "year": 1964}

Per accedir de manera segura a un “dict” pots utilitzar un accés condicional amb if:

python
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:

python
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:

python
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},
]
Task

Quina és l’altura màxima?

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

Show solution
python
    max = 0
    for p in persons:
        if p["altura"] > max:
            max = p["altura"]
        
    # Mostrem per verificar el resultat esperat.
    # print(max)
    assert max == 182
Show solution
python
result = max([p["altura"] for p in persons])
assert result == 182
Task

Quina és la mitja d’edat?

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

Show solution
python
    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 == 31
Show solution
python
result = sum([p["edat"] for p in persons]) / len(persons)
assert result == 31
Task

Quina és la persona més alta?

Show solution
python
result = persons[0]
for person in persons[1:]:
    if person["edat"] > result["edat"]:
        result = person

assert result["nom"] == "Laura"
Task

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

ps
Eva Vilaregut
Raquel Viñales
Esther Parra
Laura Casademunt

Tens dues solucions:

Show solution
[print(f"{person["nom"]} {person["cognom"]}") for person in persons if person["sexe"] == "Dona"]
Show solution
[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:

python
from dataclasses import dataclass

@dataclass
class Country:
    name: str
    size: int
Note

A Object ja estudiarem exactament que és una classe.

A continuació crea un pais:

python
spain = Country("Spain", 504_030)
print(spain)
Country(name='Spain', size=504030)

Però no pots crear un pais amb la seva capital:

python
france = Country("France", "Paris", 675_417)
shell
    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:

Task

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

Show solution
python
from dataclasses import dataclass

@dataclass
class Country:
    name: str
    capital: str
    size: int

Crea un dataclass france

Show solution
python
france = Country("France", 675_417)
print(france)
Country(name='France', capital='Paris', size=675417)

Continua llegint:

Activitats

A continuació tens una llista de paisos:

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

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

Show solution
python
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:

python
>>> 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:

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

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

Show solution
python
result = countries[0]
for country in countries[1:]:
    if country[1] > result[1]:
        result = country

assert result[0] == "France"