172 votes

ajouter plusieurs valeurs pour une clé dans un dictionnaire Python

Je suis nouveau dans le monde de python et j'ai une liste d'années et de valeurs pour chaque année. Ce que je veux faire, c'est vérifier si l'année existe déjà dans un dictionnaire et si c'est le cas, ajouter la valeur à cette liste de valeurs pour la clé spécifique.

Par exemple, j'ai une liste d'années et j'ai une valeur pour chaque année :

2010  
2  
2009  
4  
1989  
8  
2009  
7  

Ce que je veux faire, c'est remplir un dictionnaire avec les années comme clés et ces numéros à un chiffre comme valeurs. Cependant, si l'année 2009 est listée deux fois, je veux ajouter la deuxième valeur à la liste des valeurs de ce dictionnaire :

2010: 2  
2009: 4, 7  
1989: 8  

Actuellement, j'ai les éléments suivants :

d = dict()  
years = []  

(get 2 column list of years and values)

for line in list:    
    year = line[0]   
    value = line[1]  

for line in list:  
    if year in d.keys():  
        d[value].append(value)  
    else:  
        d[value] = value  
        d[year] = year

1 votes

Une autre question similaire : stackoverflow.com/questions/5378231/

240voto

Faisal Points 1939

Si je peux reformuler votre question, ce que vous voulez est un dictionnaire avec les années comme clés et un tableau pour chaque année contenant une liste de valeurs associées à cette année, n'est-ce pas ? Voici comment je procéderais :

years_dict = dict()

for line in list:
    if line[0] in years_dict:
        # append the new number to the existing array at this slot
        years_dict[line[0]].append(line[1])
    else:
        # create a new array in this slot
        years_dict[line[0]] = [line[1]]

Ce que vous devriez obtenir dans years_dict est un dictionnaire qui ressemble à ce qui suit :

{
    "2010": [2],
    "2009": [4,7],
    "1989": [8]
}

En général, les mauvaises pratiques de programmation consistent à créer des "tableaux parallèles", dans lesquels les éléments sont implicitement associés les uns aux autres en ayant le même index plutôt que d'être des enfants propres d'un conteneur qui les englobe tous les deux.

20 votes

C'est sans aucun doute la bonne façon de procéder, même si ce n'est pas nécessairement la plus concise compte tenu de la disponibilité d'astuces sympas telles que dict.setdefault() et collections.defaultdict comme faisant partie du jeu d'outils par défaut disponible pour les installations modernes de Python.

2 votes

Si vous utilisez defaultdict, configurez-le comme une liste : dd = defaultdict(list)

1 votes

Cette approche est très peu performante par rapport aux autres méthodes décrites dans les autres réponses.

123voto

jathanism Points 15208

Vous feriez mieux d'utiliser collections.defaultdict (ajouté dans Python 2.5). Cela vous permet de spécifier le type d'objet par défaut d'une clé manquante (telle qu'un list ).

Ainsi, au lieu de créer d'abord une clé si elle n'existe pas, puis de l'ajouter à la valeur de la clé, vous supprimez l'intermédiaire et ajoutez directement des clés inexistantes pour obtenir le résultat souhaité.

Un exemple rapide en utilisant vos données :

>>> from collections import defaultdict
>>> data = [(2010, 2), (2009, 4), (1989, 8), (2009, 7)]
>>> d = defaultdict(list)
>>> d
defaultdict(<type 'list'>, {})
>>> for year, month in data:
...     d[year].append(month)
... 
>>> d
defaultdict(<type 'list'>, {2009: [4, 7], 2010: [2], 1989: [8]})

De cette façon, vous n'avez pas à vous soucier de savoir si vous avez vu un chiffre associé à une année ou non. Il suffit d'ajouter et d'oublier, sachant qu'une clé manquante sera toujours une liste. Si une clé existe déjà, elle sera simplement ajoutée à la liste.

4 votes

C'est la meilleure réponse. L'intention ici est de créer une dictée de listes, et la façon la plus simple de le faire est d'utiliser la méthode suivante defaultdict(list) . Félicitations

1 votes

Approche très soignée et propre.

57voto

Daniel Roseman Points 199743

Vous pouvez utiliser setdefault .

for line in list:  
    d.setdefault(year, []).append(value)

Cela fonctionne parce que setdefault renvoie la liste et la définit dans le dictionnaire, et parce qu'une liste est mutable, l'ajout à la version renvoyée par setdefault est identique à l'ajout à la version contenue dans le dictionnaire lui-même. Si cela a un sens.

27voto

Hugh Bothwell Points 22635
d = {} 

# import list of year,value pairs

for year,value in mylist:
    try:
        d[year].append(value)
    except KeyError:
        d[year] = [value]

A la manière des Pythons - il est plus facile de recevoir le pardon que de demander la permission !

7 votes

La méthode python consiste à ne pas dupliquer la fonctionnalité

3 votes

Je ne vois pas en quoi il y a double emploi ici.

7voto

erik Points 199

C'est plus facile si vous mettez ces valeurs dans une liste de tuples. Pour ce faire, vous pouvez utiliser le découpage en liste et la fonction zip.

data_in = [2010,2,2009,4,1989,8,2009,7]
data_pairs = zip(data_in[::2],data_in[1::2])

Zip prend un nombre arbitraire de listes, dans ce cas les entrées paires et impaires de data_in et les rassemble en un tuple.

Nous pouvons maintenant utiliser le setdefault méthode.

data_dict = {}
for x in data_pairs:
    data_dict.setdefault(x[0],[]).append(x[1])

setdefault prend une clé et une valeur par défaut, et renvoie la valeur associée, ou s'il n'y a pas de valeur courante, la valeur par défaut. Dans ce cas, nous obtiendrons une liste vide ou remplie, à laquelle nous ajouterons la valeur actuelle.

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