-4
votes

Valeurs du dictionnaire Python à la liste

J'utilise Python3.6.

Il y a un dictionnaire Python p> xxx pré>

Obtenez toutes les valeurs de "AA" et "BB" et placez une liste. p>

Comment convertir MY_DICT Dictionary vers ce format de manière optimisée? P>

new_dict = {}
for month, data in my_dict.items():
    for key, value in data.items():
         new_dict.setdefault(key, [])
         new_dict[key].append(value)
print(new_dict)


4 commentaires

Astuce: une solution est d'utiliser collections.defaultdict


Si vous êtes ouvert à l'utilisation de pandas , vous pouvez faire new_dict = pd.dataframe (my_dict.values ​​()). To_dict (orient = 'list')


J'ai ajouté mon moyen de convertir des données en question. Mais avec de vraies données, c'est lent. Je cherche une manière optimisée pour la conversion.


@pault pandas fonctionne !! J'ai appris une nouvelle chose aujourd'hui. Pouvez-vous s'il vous plaît donner exemple comment utiliser collections.defaultDict dans ce cas?


3 Réponses :


1
votes

C'est assez trivial, mais je suis toujours déçu que vous n'ayez pas inclus une tentative codée de votre choix. (Jusqu'à ce que je puisse éditer votre message 15 minutes plus tard ...)

my_dict = {"AUG": {"AA": 10, "BB": 55},
           "SEPT": {"AA": 11, "BB": 56},
           "OCT": {"AA": 12, "BB": 57},
           "NOV": {"AA": 13, "BB": 58},
           "DEC": {"AA": 14, "BB": 59}
}

new_dict = {"AA": [], "BB": []}
for item in my_dict.values():
    for key in new_dict:
        new_dict[key].append(item[key])

print(new_dict)


5 commentaires

Juste parce que peut faire peut-être effectué dans une seule ligne ( {k: liste (carte (itemGetter (1), g)) pour k, g in groupby (trié (chaîne.from_iterable (carte (dict.items, my_dict.values ​​()))), itemGetter (0))} ) ne veut pas dire que vous devriez. Une boucle simple est meilleure ici, imo.


@pault pour la lisibilité (une considération très importante), oui la forme expansée est significativement meilleure. Cependant, je crois comprendre que les compréhensions sont légèrement plus rapides et OP indiquent qu'il recherche une "voie optimale". Merci d'inclure la version de doublure si!


Utilisation de Pandas, une meilleure doublure serait: new_dict = pd.dataframe (my_dict.values ​​()). To_dict (orient = 'Liste')


ne peut pas utiliser de cette façon. Parce que voici ici les clés du code difficiles dans my_dict. NEW_DICT = {"AA": [], "BB": []}


@pault j'ai pensé qu'il y aurait un super pandas méthode aussi. Cependant, OP n'a pas précisé ce qu'il cherchait



3
votes

J'utilise cela pour convertir mais mes données sont grandes et sa conversion lente p>

Voici quelques tests de vitesse pour vous aider à comparer les différentes méthodes: P>

Configurer des données aléatoires h3>

D'abord, je vais créer un dictionnaire aléatoire avec 1000 Outer_Keys et tous les 2 Caractères majuscules pour clés internes avec des valeurs entières aléatoires. P>

df = pd.DataFrame(my_dict.values())
%%timeit
new_dict_pandas_2 = df.to_dict(orient='list')
# 100 loops, best of 3: 7.99 ms per loop

0 commentaires

0
votes

Ceci peut facilement être fait avec une compréhension

result = {k:[d[k] for d in my_dict.values()] for k in ("AA","BB")}

# {'AA': [10, 11, 12, 13, 14], 'BB': [55, 56, 57, 58, 59]}


0 commentaires