3 votes

Associer les valeurs du dictionnaire à une liste

J'ai un dictionnaire dont les valeurs sont une liste :

dict ={10: ['jhon', 'abc', 'wa@gmail.com'], 12: ['raghav', 'awdaw', 'raghavpatnecha15@gmail.com']}

Maintenant j'y accède comme ceci : dict[10][0]

Mais c'est si confus car je ne sais pas ce qui se trouve à l'indice 0 dans ma liste pour une clé particulière.

Pour cela, j'ai une autre liste qui m'aide à savoir ce qui se trouve à index i.

['Nom du manager', 'Nom du propriétaire', 'Email']

Donc maintenant c'est plus facile d'accéder aux valeurs de mon dictionnaire. Comme je veux utiliser : dict[10]['Nom du manager'] au lieu de dict[10][0]

Est-ce réalisable en Python. Parce que j'ai essayé de me référer à Associer deux listes dans un dictionnaire Mais comment faire correspondre les valeurs d'un dictionnaire à une liste

3voto

jpp Points 83462

Oui, c'est possible. Il suffit de restructurer votre dictionnaire en un dictionnaire imbriqué :

d_input = {10: ['jhon', 'abc', 'wa@gmail.com'],
           12: ['raghav', 'awdaw', 'raghavpatnecha15@gmail.com']}

d = {k: {'Nom du Manager': a, 'Nom du Propriétaire': b, 'Email': c} \
        for k, (a, b, c) in d_input.items()}

Résultat :

{10: {'Email': 'wa@gmail.com', 'Nom du Manager': 'jhon', 'Nom du Propriétaire': 'abc'},
 12: {'Email': 'raghavpatnecha15@gmail.com', 'Nom du Manager': 'raghav', 'Nom du Propriétaire': 'awdaw'}}

Version extensible avec zip :

cats = ['Nom du Manager', 'Nom du Propriétaire', 'Email']

d = {k: dict(zip(cats, v)) for k, v in d_input.items()}

3voto

Aran-Fey Points 20414

Ceci est un cas d'utilisation clair pour classes.

Au lieu d'avoir des listes qui représentent des entreprises comme ['jhon', 'abc', 'wa@gmail.com'], python vous donne la possibilité de modéliser cela comme une classe :

class Company:
    def __init__(self, manager_name, owner_name, email):
        self.manager_name = manager_name
        self.owner_name = owner_name
        self.email = email

companies = {10: Company('jhon', 'abc', 'wa@gmail.com'),
             12: Company('raghav', 'awdaw', 'raghavpatnecha15@gmail.com'}

Cela vous donne une interface beaucoup plus agréable qu'une liste, car vous pouvez accéder aux attributs par nom plutôt que par index :

>>> comp = Company('jhon', 'abc', 'wa@gmail.com')
>>> comp.manager_name
'jhon'
>>> comp.owner_name
'abc'
>>> comp.email
'wa@gmail.com'

Si vous êtes paresseux et ne voulez pas définir manuellement la classe Company, vous pouvez utiliser collections.namedtuple pour réduire la quantité de code que vous avez à écrire :

from collections import namedtuple

Company = namedtuple('Company', 'manager_name owner_name email')

Vous pouvez également convertir votre dictionnaire de listes en un dictionnaire d'instances de Company facilement :

companies = {10: ['jhon', 'abc', 'wa@gmail.com'],
             12: ['raghav', 'awdaw', 'raghavpatnecha15@gmail.com']}

comps = {num: Company(*comp) for num, comp in companies.items()}
# résultat :
# {10: Company(manager_name='jhon', owner_name='abc', email='wa@gmail.com'),
#  12: Company(manager_name='raghav', owner_name='awdaw', email='raghavpatnecha15@gmail.com')}

2voto

Guybrush Points 1515

Si vos "attributs" sont toujours exactement ['Nom du Gestionnaire', 'Nom du Propriétaire', 'Email'], vous devriez envisager d'utiliser des namedtuple ou le nouveau dataclass de Python 3.7.

Voici un exemple utilisant des namedtuple :

from collections import namedtuple

Societe = namedtuple('Societe', ['gestionnaire', 'proprietaire', 'email'])

societe = Societe('jhon', 'abc', 'wa@gmail.com')
print(societe.gestionnaire, societe.proprietaire, societe.email)

résultat en jhon abc wa@gmail.com

1voto

pilu Points 494

Vous devriez utiliser named tuples.

Votre code pourrait ressembler à ceci :

from collections import namedtuple

Company = namedtuple('Company', 'ManagerName OwnerName Email')

c1 = Company('jhon', 'abc', 'wa@gmail.com')
c2 =  Company('raghav', 'awdaw', 'raghavpatnecha15@gmail.com')

companies = {10: c1, 12: c2}
companies[10].Email

1voto

Keyur Potdar Points 5978

Si vous ne souhaitez pas modifier le dictionnaire, vous pouvez utiliser un autre dictionnaire pour faire correspondre les indices aux valeurs correspondantes.

>>> d = {10: ['jhon', 'abc', 'wa@gmail.com'], 12: ['raghav', 'awdaw', 'raghavpatnecha15@gmail.com']}    
>>> mapper = {'Nom du manager': 0, 'Nom du propriétaire': 1, 'Email': 2}    
>>> d[10][mapper['Nom du manager']]
'jhon'
>>> d[12][mapper['Email']]
'raghavpatnecha15@gmail.com'

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X