Python: объединить значения в список для уникального ключа - PullRequest
1 голос
/ 01 июля 2019

У меня есть список словарей, которые содержат ключ и значение словарей как таковые:

Array = [
    {'Example1': {'Time Taken': 56, 'Type': 'Quiz'} },
    {'Example1': {'Time Taken': 58, 'Type': 'Exam'} },
    {'Example2': {'Time Taken': 40, 'Type': 'Quiz'} } ]

Я хочу перебрать список и получить только уникальные ключи со значениями, объединенными водин список как таковой:

{ 'Example1': [
    { 'Time Taken': 56, 'Type': 'Quiz' },
    { 'Time Taken': 58, 'Type': 'Exam' } ] }

{ 'Example2': [ { 'Time Taken': 40, 'Type': 'Quiz' } ] }

Есть идеи, как это сделать?Я пробовал много разных вещей, но не могу найти эффективный способ написания этого кода.Любые отзывы приветствуются.

Ответы [ 4 ]

2 голосов
/ 01 июля 2019

Использование collections.defaultdict

Пример:

from collections import defaultdict

Array = [ {"Example1": {"Time Taken": 56, "Type": "Quiz"} }, {"Example1": {"Time Taken": 58, "Type": "Exam"} }, {"Example2": {"Time Taken": 40, "Type": "Quiz"} } ]
result = defaultdict(list)
for ar in Array:                 #Iterate each element in list
    for k, v in ar.items():      #Iterate your dict
        result[k].append(v)      #Create key-list.
print(result)

Выход:

defaultdict(<class 'list'>, {'Example1': [{'Time Taken': 56, 'Type': 'Quiz'}, {'Time Taken': 58, 'Type': 'Exam'}], 'Example2': [{'Time Taken': 40, 'Type': 'Quiz'}]})
0 голосов
/ 01 июля 2019

Я создал следующее без какого-либо внешнего модуля

Array = [{'Example1': {'Time Taken': 56, 'Type': 'Quiz'} }, 
         {'Example1': {'Time Taken': 58, 'Type': 'Exam'} }, 
         {'Example2': {'Time Taken': 40, 'Type': 'Quiz'} }]

result = {}
for i in range(len(Array)):
    dict = Array[i]
    for key in dict :
        if key in result:
            result[key].append(dict[key]) 
        else:
            result[key]=[dict[key]]

print(result)

Выход:

{
 'Example1': [{'Time Taken': 56, 'Type': 'Quiz'},
              {'Time Taken': 58, 'Type': 'Exam'}],
 'Example2': [{'Time Taken': 40, 'Type': 'Quiz'}]
}
0 голосов
/ 01 июля 2019

Попробуйте следующее.

from collections import defaultdict
# l is list of dictionaries
d = defaultdict(list)
for x in l:
    for y in x:
        d[y].append(x[y])
print(d)
0 голосов
/ 01 июля 2019

Вы можете выполнять итерации по диктовкам и использовать dict.setdefault, чтобы установить значение по умолчанию как пустой список, если ключ отсутствует, и добавить к списку в противном случае:

for dct in Array: 
    for k, v in dct.items(): 
        out.setdefault(k, []).append(v) 

out - желаемый результат dict.

Пример:

In [1208]: arr = [ {'Example1': {'Time Taken': 56, 'Type': 'Quiz'} }, {'Example1': {'Time Taken': 58, 'Type': 'Exam'} }, {'Example2': {'Time Taken': 40, 'Type': 'Quiz'} } ]                                

In [1209]: out = {}                                                                                                                                                                                         

In [1210]: for dct in arr: 
      ...:     for k, v in dct.items(): 
      ...:         out.setdefault(k, []).append(v) 
      ...:                                                                                                                                                                                                  

In [1211]: out                                                                                                                                                                                              
Out[1211]: 
{'Example1': [{'Time Taken': 56, 'Type': 'Quiz'},
  {'Time Taken': 58, 'Type': 'Exam'}],
 'Example2': [{'Time Taken': 40, 'Type': 'Quiz'}]}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...