Добавление списка значений в пару значений и ключей в python - PullRequest
0 голосов
/ 21 февраля 2020

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

{'a':[(0,1),(1,1),(2,1),(0,2),(0,3)]}

Так что теперь я хотел бы получить его таким образом:

{'a':[(3,1),(0,2),(0,3)]}

Так что конкретно я хочу взять второй элемент в списке значений равным grouped by и первый элемент в списке значений, чтобы получить его сумму.

Ответы [ 3 ]

0 голосов
/ 21 февраля 2020
dictionary = {"a":[(0,1),(1,1),(2,1),(0,2),(0,3)]}

for k, l in dictionary.items():
    # have a temporary dictionary for each list
    temp_dictionary = dict()

    # for each tuple value, add the associated keys
    for tuple_k, tuple_v in l:
        # get(key, default_value_if_key_not_found)
        temp_dictionary[tuple_v] = temp_dictionary.get(tuple_v, 0) + tuple_k

    # replace the list in the original dictionary
    dictionary[k] = [(tuple_v, tuple_k) for (tuple_k, tuple_v) in temp_dictionary.items()]

print(dictionary)
# {a:[(3,1),(0,2),(0,3)]} 
0 голосов
/ 22 февраля 2020

Предполагая, что кортежи в массивах упорядочены (или, по крайней мере, сгруппированы) по второму значению, вы можете использовать функцию groupby из itertools, чтобы выполнить преобразование:

from itertools import groupby

def group(tuples):
    return [ (sum(next(zip(*ts))),k) for k,ts in groupby(tuples,key=lambda t:t[1])]

d  = { "a":[(0,1),(1,1),(2,1),(0,2),(0,3)] }
d2 = { key:group(tuples) for key,tuples in d.items() }

# d2: {'a': [(3, 1), (0, 2), (0, 3)]}

, если нет, вы нужно отсортировать их в групповой функции, используя:

tuples = sorted(tuples,key=lambda t:t[1])
0 голосов
/ 21 февраля 2020
from collections import defaultdict

dic = {'a': [(0,1),(1,1),(2,1),(0,2),(0,3)]}

newdic = {}
for k, v in dic.items():
    d = defaultdict(int)
    for vv in v:
        d[vv[1]] += vv[0]
    newdic[k] = [(v, k) for k, v in d.items()]
print(newdic)
# {'a': [(3, 1), (0, 2), (0, 3)]}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...