2015-07-14 4 views
0

У меня есть структура данных. Список из 4 словарей, каждый из которых содержит 4 ключа и 3 значения в списке.Суммировать различные списки из словарей PYTHON

dict_list = [0] {key1: [1, 2, 3] 
        key2: [4, 5, 6] 
        key3: [7, 8, 9] 
        key4: [10, 11, 12] 

      [1] {key1: [13.......] 
        key2: [16... etc. 

Я хочу, чтобы подвести каждую колонку к югу [1, 4, 7, 10] .... [2,5,8,11] и т.п. в виде

new_dict_list = [0] {new_key: [(1+4+7+10), (2,5,8,11), (3,6,9,12)] 
       [1] {new_key2: [(13+16....) etc. 

Так что я 'в основном каскадирование каждого столбца в каждом словаре.

У меня ОЧЕНЬ явный и длинный путь, чтобы сделать это до сих пор (проверка правильности математики), есть ли способ использовать понимание списков для чего-то такого с длинным или это не стоит усилий в конце?

+1

вопрос, почему '[(1 + 4 + 7 + 10), (2,5 , 8,11), (3,6,9,12)] 'перейти к' key1'? Как вы определяете «ключ1»? Обратите внимание: 'dict' не имеет порядка заказа. –

+1

где делают 'key1',' key2'? – LittleQ

+0

@AnandSKumar, приняв новый список словарей, ключ не имеет значения. Ключ1 в каждом будет помечен в зависимости от того, что я хочу. (отредактировано, чтобы быть более явным с этим) – cc6g11

ответ

0

Вы можете использовать zip и sum функции:

dict_lis=[{next(d.iterkeys()):map(sum,zip(*d.values()))} for d in dict_lis] 

dict.iterkeys() будет возвращает итератор ключей словаря, который вы можете получить первый ключ, используя next function.but отметить, что не будет возвращать первый ключ порядок, в котором вы определили свои словари. Поскольку словарные статьи не упорядочены, вы можете использовать collections.OrderedDict для получения упорядоченного словаря.

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

пример:

dict_lis=[{'key1': [1, 2, 3],'key2': [4, 5, 6],'key3': [7, 8, 9],'key4': [10, 11, 12]},{'key5': [13,14,15],'key6': [16,17,18]}] 
print [{next(d.iterkeys()):map(sum,zip(*d.values()))} for d in dict_lis] 

[{'key3': [22, 26, 30]}, {'key6': [29, 31, 33]}] 
+0

'TypeError: неподдерживаемый тип операндов для +: 'int' и 'list'' –

+0

@BrentWashburne Извините, вам нужно распаковать значения! – Kasramvd

+0

@AnandSKumar Я думаю, что OP не означает, что все ключи одинаковы, но 'key1' и ... являются поддельными и демонстрируют пример! также я отметил, что в ответ! – Kasramvd

3

Применение zip к группе [1, 4, 7, 10] .... [2,5,8,11]:

>>> d = dict_list[0] 
>>> zip(*d.values()) 
[(7, 4, 1, 10), (8, 5, 2, 11), (9, 6, 3, 12)] 

Использование map для создать новый список:

>>> map(sum, zip(*d.values())) 
[22, 26, 30] 

Если вы используете python3.x, вам нужно list(map...), чтобы получить список.

0

Оригинальная версия, используя списочные:

# set up the initial data 
dict_list = [] 
dict_list.append({'key1': range(1,4), 
        'key2': range(4,7), 
        'key3': range(7,10), 
        'key4': range(10,13)}) 
dict_list.append({'key1': range(13,16), 
        'key2': range(16,19), 
        'key3': range(19,22), 
        'key4': range(22,25)}) 

# generate the new list 
new_dict_list = [] 
for d in dict_list: 
    new_dict_list.append({'new_key': [sum(v[0] for v in d.values()), 
             sum(v[1] for v in d.values()), 
             sum(v[2] for v in d.values())] }) 

print new_dict_list 

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

[{'new_key': [22, 26, 30]}, {'new_key': [70, 74, 78]}] 
+0

как насчет длины списка больше 3? – LittleQ

+0

Ваш ответ более гибкий для переменной длины списка. В моем ответе используются списки, как указано в вопросе. –

Смежные вопросы