87 votes

Créer un dictionnaire avec des clés dupliquées en Python

J'ai la liste suivante qui contient des numéros d'immatriculation de voiture en double avec des valeurs différentes. Je veux la convertir en un dictionnaire qui accepte ces clés multiples de numéros d'immatriculation.

Jusqu'à présent, lorsque j'essaie de convertir une liste en dictionnaire, il élimine une des clés. Comment puis-je créer un dictionnaire avec des clés dupliquées ?

La liste est :

EDF768, Bill Meyer, 2456, Vet_Parking
TY5678, Jane Miller, 8987, AgHort_Parking
GEF123, Jill Black, 3456, Creche_Parking
ABC234, Fred Greenside, 2345, AgHort_Parking
GH7682, Clara Hill, 7689, AgHort_Parking
JU9807, Jacky Blair, 7867, Vet_Parking
KLOI98, Martha Miller, 4563, Vet_Parking
ADF645, Cloe Freckle, 6789, Vet_Parking
DF7800, Jacko Frizzle, 4532, Creche_Parking
WER546, Olga Grey, 9898, Creche_Parking
HUY768, Wilbur Matty, 8912, Creche_Parking
EDF768, Jenny Meyer, 9987, Vet_Parking
TY5678, Jo King, 8987, AgHort_Parking
JU9807, Mike Green, 3212, Vet_Parking

Le code que j'ai essayé est le suivant :

data_dict = {}
data_list = []

def createDictionaryModified(filename):
  path = "C:\Users\user\Desktop"
  basename = "ParkingData_Part3.txt"
  filename = path + "//" + basename
  file = open(filename)
  contents = file.read()
  print contents,"\n"
  data_list = [lines.split(",") for lines in contents.split("\n")]
  for line in data_list:
    regNumber = line[0]
    name = line[1]
    phoneExtn = line[2]
    carpark = line[3].strip()
    details = (name,phoneExtn,carpark)
    data_dict[regNumber] = details
  print data_dict,"\n"
  print data_dict.items(),"\n"
  print data_dict.values()

142voto

NPE Points 169956

Les dictionnaires Python ne prennent pas en charge les clés dupliquées. Une façon de contourner ce problème est de stocker des listes ou des ensembles à l'intérieur du dictionnaire.

Une façon simple d'y parvenir est d'utiliser defaultdict :

from collections import defaultdict

data_dict = defaultdict(list)

Tout ce que vous avez à faire est de remplacer

data_dict[regNumber] = details

con

data_dict[regNumber].append(details)

et vous obtiendrez un dictionnaire de listes.

48voto

Scorpil Points 628

Vous pouvez modifier le comportement des types intégrés dans Python. Dans votre cas, il est très facile de créer une sous-classe de dict qui stockera automatiquement les valeurs dupliquées dans les listes sous la même clé :

class Dictlist(dict):
    def __setitem__(self, key, value):
        try:
            self[key]
        except KeyError:
            super(Dictlist, self).__setitem__(key, [])
        self[key].append(value)

Exemple de sortie :

>>> d = dictlist.Dictlist()
>>> d['test'] = 1
>>> d['test'] = 2
>>> d['test'] = 3
>>> d
{'test': [1, 2, 3]}
>>> d['other'] = 100
>>> d
{'test': [1, 2, 3], 'other': [100]}

9voto

DonCallisto Points 9157

Vous ne pouvez pas avoir un dictateur avec des clés dupliquées pour la définition ! Au lieu de cela, vous pouvez utiliser une clé unique et, comme valeur, une liste d'éléments qui ont cette clé.

Vous pouvez donc suivre ces étapes :

  1. Vérifiez si la clé de l'élément actuel (de votre jeu initial) se trouve dans le dict final. Si c'est le cas, passez à l'étape 3
  2. Mettre à jour le dict avec la clé
  3. Ajoute la nouvelle valeur à la liste dict[key].
  4. Répétez [1-3]

8voto

xiansweety Points 107

Vous pouvez vous référer à l'article suivant : http://www.wellho.net/mouth/3934_Multiple-identical-keys-in-a-Python-dict-yes-you-can-.html

Dans un dict, si une clé est un objet, il n'y a pas de problème de duplication.

Par exemple :

class p(object):
    def __init__(self, name):
        self.name = name
    def __repr__(self):
        return self.name
    def __str__(self):
        return self.name
d = {p('k'): 1, p('k'): 2}

8voto

Blckknght Points 20780

Je viens de poster une réponse à une question qui a été fermée par la suite en tant que doublon de celle-ci (pour de bonnes raisons je pense), mais je suis surpris de voir que la solution que je propose n'est incluse dans aucune des réponses ici.

Plutôt que d'utiliser un defaultdict ou de s'embêter avec des tests d'appartenance ou le traitement manuel des exceptions, vous pouvez facilement ajouter des valeurs aux listes d'un dictionnaire à l'aide de la commande setdefault méthode :

results = {}                              # use a normal dictionary for our output
for k, v in some_data:                    # the keys may be duplicates
    results.setdefault(k, []).append(v)   # magic happens here!

C'est un peu comme utiliser un defaultdict, mais vous n'avez pas besoin d'un type de données spécial. Lorsque vous appelez setdefault il vérifie si le premier argument (la clé) est déjà dans le dictionnaire. Si elle ne trouve rien, elle attribue le second argument (la valeur par défaut, une liste vide dans ce cas) comme nouvelle valeur pour la clé. Si la clé existe, rien de spécial n'est fait (la valeur par défaut est inutilisée). Dans tous les cas, la valeur (qu'elle soit ancienne ou nouvelle) est retournée, donc nous pouvons inconditionnellement appeler append sur elle, sachant qu'elle doit toujours être une liste.

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