2014-10-23 5 views
1

Мне нужно решить что-то, что было бы довольно просто для меня в PHP, но я не знаю, как это сделать в Python.Объединить значения списков внутри словаря

Пусть у меня есть следующий словарь:

data = {'year': [], 'week': [], 'value': []} 

все списки будут всегда иметь одинаковую длину, поэтому возможное значение данных будет:

{'year': ['2014', '2014', '2014'], 'week': ['44', '49', '49'], 'value': [15, 20, 30]} 

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

Когда итерация список 'неделя':

· Если текущая неделя имеет то же значение, что и следующая в списке:

·· Перезаписать эту неделю следующей, переписать год следующим образом и суммировать значения с теми же индексами, что и неделя.

Что я ожидаю получить:

Так результат будет:

{'year': ['2014', '2014'], 'week': ['44', '49'], 'value': [15, 50]} 

Что я пробовал:

· Итерации над словарем, но зато мой бедный знание python, я получил ошибки, такие как object of type 'bool' has no len() при попытке построить цикл for. (Я использовал конструкции for i in range len(dictionary.index))

· Отъезд itertools и collections, но я не могу найти что-либо, что подходит.

· Пошаговое руководство простейшим способом: перескакивание списков из словаря в другой список, а затем сравнение элементов по одному, сохранение значений в другой список и т. Д.

Любые идеи или документация для проверки? (Кроме постоянно учиться питона)

ответ

2

Использование itertools.groupby и перебрать enumerate(d['week']):

from itertools import groupby 
from operator import itemgetter 

d = {'year': ['2014', '2014', '2014'], 'week': ['44', '49', '49'], 'value': [15, 20, 30]} 
out = {'year': [], 'week': [], 'value': []} 

for k, g in groupby(enumerate(d['week']), key=itemgetter(1)): 
    total = 0 
    for i, x in g: 
     total += d['value'][i] 
    # Now `i` is the last index of the group and `x` is the last week of the group, 
    # We can use these to get values from 'year' and 'week'. 
    out['year'].append(d['year'][i]) 
    out['week'].append(x) 
    out['value'].append(total) 

print out 
#{'week': ['44', '49'], 'value': [15, 50], 'year': ['2014', '2014']} 
+0

Потрясающе, я проверил '' groupby' но enumerate' было то, что я пропускал о том, как использовать его в качестве индекса, среди прочего ... Кроме того, это сладкий «пуфонический» способ TFYH – zedee

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