Объединить элемент словаря в список словарей в - PullRequest
0 голосов
/ 23 марта 2020

Надеюсь, у вас хороший момент,

У меня проблема со словарями.

Предположим, у нас есть словарь A с ключами n (в данном случае их 2 ):

A = {
    weather: ['sunny', 'rain', 'cloudy'],   
    temperature: ['warm', 'cold']
}

Мы хотим создать list из dict с каждой комбинацией элементов. Так как в примере есть 3 элемента x 2 элемента, таким образом, будет список со словарем 6.

Результат будет выглядеть следующим образом:

B = [
    {weather: 'sunny', temperature='warm'},
    {weather: 'sunny', temperature='cold'},
    {weather: 'rain', temperature='warm'},
    {weather: 'rain', temperature='cold'},
    {weather: 'cloudy', temperature='warm'},
    {weather: 'cloudy', temperature='cold'}
    ]

То, что я сейчас пытаюсь сделать так:

B = []
for key,value  in A.items():
    for item in value:
        B.append([key, item])

Но не получается.

Есть ли способ сделать это? Вот некоторые важные проблемы:

  • Клавиши находятся на одном уровне.
  • Количество клавиш будет динамически. Таким образом, регистр Python объединяет элементы в словаре не будет работать. (Может быть, некоторые модификации будут)

Любое решение будет благодарен. (Извините за мой плохой английский sh).

Ответы [ 2 ]

3 голосов
/ 23 марта 2020

Существует короткое выражение, использующее zip, метод values и itertools.product:

>>> from itertools import product
>>> A = {'weather': ['sunny', 'rain', 'cloudy'], 'temperature': ['warm', 'cold']}
>>> B = [dict(zip(A, x)) for x in product(*A.values())]
>>> for d in B:
...   print(d)
...
{'weather': 'sunny', 'temperature': 'warm'}
{'weather': 'sunny', 'temperature': 'cold'}
{'weather': 'rain', 'temperature': 'warm'}
{'weather': 'rain', 'temperature': 'cold'}
{'weather': 'cloudy', 'temperature': 'warm'}
{'weather': 'cloudy', 'temperature': 'cold'}

Вызов product создает список пар, таких как ('sunny', 'warm'). Когда вы заархивируете такую ​​пару с помощью клавиш dict, вы получите последовательность пар, например ('weather','sunny') и ('temperature','warm'), которую dict можно превратить в нужный словарь.

Обратите внимание, что это работает, потому что итератор, который предоставляет ключи, и метод values возвращают свои элементы в одинаковом порядке, так что вам не нужно беспокоиться о получении чего-то вроде {'weather': 'warm', 'temperature': 'sunny'}.

1 голос
/ 23 марта 2020
A = {
    'weather': ['sunny', 'rain', 'cloudy'],   
    'temperature': ['warm', 'cold']
}

B = [{'weather': a,'temperature': b} for a in A['weather'] for b in A['temperature']]

Не могли бы вы попробовать это

...