Сопоставить два списка (один из которых является списком списков) в словарь - PullRequest
3 голосов
/ 25 марта 2020

У меня есть 2 списка:

List_1: [a,a,a,b,b,c,c,c,a,a]

и соответствующий список List_2: [{1,2,3},{5,6,9},{10},{11},{27,18,29},{1,2,3},{7,10},{34},{83},{60}], который является списком наборов для каждого из элементов в List_1.

Мне нужен словарь, содержащий уникальные элементы в list_1 и оцениваемые их соответствующими (объединенными) списками из list_2. Так, например, вывод, который я искал бы здесь, был бы:

Dict = {a:[1,2,3,5,6,9,10,83,60], b:[11,27,18,29], c:[1,2,3,7,10,34]}

Мой первый инстинкт был dict(zip(list_1,list_2)), который, очевидно, не работал ...

Любая помощь оценена :)

Ответы [ 3 ]

1 голос
/ 25 марта 2020

Используйте defaultdict :

from collections import defaultdict

list_1 = ['a', 'a', 'a', 'b', 'b', 'c', 'c', 'c', 'a', 'a']
list_2 = [{1, 2, 3}, {5, 6, 9}, {10}, {11}, {27, 18, 29}, {1, 2, 3}, {7, 10}, {34}, {83}, {60}]

result = defaultdict(list)
for e1, e2 in zip(list_1, list_2):
    result[e1].extend(e2)

print(result)

Вывод

defaultdict(<class 'list'>, {'a': [1, 2, 3, 9, 5, 6, 10, 83, 60], 'b': [11, 18, 27, 29], 'c': [1, 2, 3, 10, 7, 34]})

Если вам действительно нужен словарь, просто сделайте dict(result) .

0 голосов
/ 25 марта 2020

Использовать defaultdict из коллекций

>>> from collections import defaultdict
>>> my_dict = defaultdict(set)
>>> for k, v in zip(a, b):
...     my_dict[k] = my_dict[k].union(v)
... 
>>> dict(my_dict)
{'a': {1, 2, 3, 5, 6, 9, 10, 83, 60}, 'b': {27, 18, 11, 29}, 'c': {1, 2, 3, 34, 7, 10}}
0 голосов
/ 25 марта 2020

Попробуйте:

li_1 = ["a","a","a","b","b","c","c","c","a","a"]
li_2 = [{1,2,3},{5,6,9},{10},{11},{27,18,29},{1,2,3},{7,10},{34},{83},{60}]

di = { }
for ndx,i in enumerate(li_1):
    if i in di:
        di[i].extend(list(li_2[ndx]))
    else:
        di[i] = list(li_2[ndx])

print(di)

Выходы:

{'a': [1, 2, 3, 9, 5, 6, 10, 83, 60], 'b': [11, 18, 27, 29], 'c': [1, 2, 3, 10, 7, 34]}

Чтобы уменьшить количество строк, вы можете использовать defaultdict из python модуль сбора . Используя это, мы можем избежать предложения if в for for l oop.

from collections import defaultdict

li_1 = ["a","a","a","b","b","c","c","c","a","a"]
li_2 = [{1,2,3},{5,6,9},{10},{11},{27,18,29},{1,2,3},{7,10},{34},{83},{60}]

di = defaultdict(list)
for ndx,i in enumerate(li_1):
    di[i].extend(li_2[ndx])

print(dict(di))

Мой первый инстинкт был dict (zip (list_1, list_2)), который, очевидно, не сработал

dict(zip(list_1,list_2)) отбрасывает все, кроме последнего набора, связанного с ключом. Смотрите ниже код:

di = defaultdict(list)
for i,j in zip(li_1, li_2):
    di[i].extend(j)

print(dict(di))
...