<jupyter_start><jupyter_text>Complément: les n-uplets ou tuple nommés de la librairie standard Les *p-uplets nommés* - `namedtuple` - sont définies dans le paquet `collections` de la librairie standard (livrée avec Python).Il faut donc les importer pour pouvoir les utiliser:<jupyter_code>from collections import namedtuple<jupyter_output><empty_output><jupyter_text>la fonction `namedtuple` sert à produire un *constructeur* c'est-à-dire *une fonction* dont le rôle est de produire le n-uplet nommé voulu.*Une fonction qui produit une fonction ça laisse songeur non?*Sa syntaxe est `mon_constructeur = namedtuple(, )`<jupyter_code>Personne = namedtuple('Personne', ('nom', 'prenom', 'age'))<jupyter_output><empty_output><jupyter_text>`Personne` est alors un *constructeur* de p-uplets nommés:- de type 'Personne' dont les **descripteurs** ou attributs sont:    - 'nom',    - 'prenom',    - 'age'.On l'utilise pour construire une «Personne» selon la syntaxe:- `une_personne = Personne(, , ...)`<jupyter_code>moi = Personne('Florent', 'étienne', 43)
print(f'le type de "moi" est:\n\t {type(moi)}\n Ma représentation affichable est:\n\t {moi}')<jupyter_output><empty_output><jupyter_text>On peut alors récupérer la valeur d'un descripteur avec la syntaxe:- `une_personne.`- ou bien à l'aide de l'*index* du descripteur `une_personne[i]`<jupyter_code>moi.prenom
moi[1]<jupyter_output><empty_output><jupyter_text>Le résultat du code qui suit ne devrait pas vous surprendre ...<jupyter_code>moi[0] == moi.nom, moi[-1] == 50, moi.age == 43<jupyter_output><empty_output><jupyter_text>Celui ci non plus ...<jupyter_code>nom_complet = f'{moi.prenom} {moi.nom}'
nom_complet<jupyter_output><empty_output><jupyter_text>Ni celui là ... (quoi que)<jupyter_code>for c in moi:
    print(c)<jupyter_output><empty_output><jupyter_text>On peut «déballer» -*unpacking*- un tuple nommé (comme un tuple normal):<jupyter_code>nom, prenom, age = moi
f"Je m'appelle {prenom.capitalize()} {nom.upper()} et j'ai {age} ans."<jupyter_output><empty_output><jupyter_text>À faire toi-même Écris une fonction `csv_vers_tableau(csv)` qui prend un argument une chaîne de caractères au format csv et renvoie un tableau de «vrais» n-uplets nommés. Chaque n-uplets nommés correspond à un «objet» (ligne) de la collection en csv.<jupyter_code>def csv_vers_tableau(csv):
    """Prend en argument une chaîne au format csv et renvoie le tableau de n-uplet nommés de type 'Objet' correspondant.
    ex: Pour csv == "a,b\n1,2\n3,4", elle renvoie [Objet(a='1',b='2'), Objet(a='3',b='4')]
    """...
    from collections import namedtuple
    descripteurs, *___ = [___(obj.split(___)) for obj in ___.split(___)]
    
    Objet = namedtuple('Objet', ___)
    return [___]<jupyter_output><empty_output><jupyter_text>**correction**<jupyter_code># correction
def csv_vers_tableau(csv, sep=','):
    """Prend en argument une chaîne au format csv et renvoie le tableau de n-uplet nommés de type 'Objet' correspondant.
    ex: Pour csv == "a,b\n1,2\n3,4", elle renvoie [Objet(a='1',b='2'), Objet(a='3',b='4')]
    """
    from collections import namedtuple
    descripteurs, *objets = [tuple(obj.split(sep)) for obj in csv.split('\n')]
    
    Objet = namedtuple('Objet', descripteurs)
    return [Objet(*obj) for obj in objets]

csv_vers_tableau("a,b\n1,2\n3,4")
# Pour tester
from collections import namedtuple
Objet = namedtuple('Objet', ('a', 'b'))
assert csv_vers_tableau("a,b\n1,2\n3,4") == [Objet(a='1', b='2'), Objet(a='3', b='4')]<jupyter_output><empty_output>
{'fraction_non_alphanumeric': 0.14444128518623828, 'fraction_numerical': 0.010520329826556724, 'mean_word_length': 5.739463601532567, 'pattern_counts': {'":': 0, '<': 41, '<?xml version=': 0, '>': 41, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'chain_length': '10', 'dir': 'jupyter-structured-clean-dedup', 'id': '52999', 'license': 'CC0-1.0', 'n_tokens_mistral': 1365, 'n_tokens_neox': 1338, 'n_words': 349, 'path': '01_donnees_en_tables/complements/03_2_complements_nuplets_nommes.ipynb', 'repo_name': 'efloti/cours-nsi-premiere', 'size': '3517'}