Преобразование списка списков в словарь с несколькими значениями для ключа - PullRequest
0 голосов
/ 04 декабря 2018

Мне нужно написать функцию, которая принимает список списков, представляющих друзей для каждого человека, и должна преобразовать его в словарь.поэтому вход [['A','B'],['A','C'],['A','D'],['B','A'],['C','B'],['C','D'],['D','B'],['E']] должен возвращать {A:[B,C,D],B:[A],C:[B,D],D:[B],E:None}

Вход:

[['A','B'],['A','C'],['A','D'],['B','A'],['C','B'],['C','D'],['D','B'],['E']]

Ожидаемый результат:

{A:[B,C,D],B:[A],C:[B,D],D:[B],E:None}

В настоящее время я пытаюсь сделать следующее:

s=[['A','B'],['A','C'],['A','D'],['B','A'],['C','B'],['C','D'],['D','B'],['E']]

output=dict.fromkeys((set([x[0] for x in s])),[ ])

for x in s:
    if len(x)>1:
        output[x[0]].append(x[1])
    else:
        output[x[0]].append(None)

Но вывод дает мне все значения для каждого ключа, а не возвращает только соответствующие значения

Вывод, который я получаю:

{
'A': ['B', 'C', 'D', 'A', 'B', 'D', 'B', None],

 'B': ['B', 'C', 'D', 'A', 'B', 'D', 'B', None],

 'C': ['B', 'C', 'D', 'A', 'B', 'D', 'B', None],

 'D': ['B', 'C', 'D', 'A', 'B', 'D', 'B', None],

 'E': ['B', 'C', 'D', 'A', 'B', 'D', 'B', None]
}

Ответы [ 5 ]

0 голосов
/ 04 декабря 2018

Вы можете определить функцию с именем get_dictionary(), как показано в приведенном ниже коде.

>>> def get_dictionary(l):
...     d = {}
...     for arr in l:
...         if len(arr) == 2:
...             key = arr[0]
...             if key in d:
...                 d[key].append(arr[1])
...             else:
...                 d[key] = [arr[1]]
...         else:
...             d[key] = None
...     return d
...
>>> l = [['A','B'], ['A','C'], ['A','D'], ['B','A'], ['C','B'], ['C','D'], ['D','B'], ['E']]
>>>
>>> get_dictionary(l)
{'A': ['B', 'C', 'D'], 'B': ['A'], 'C': ['B', 'D'], 'D': None}
>>>

Довольно печатать словарь в формате JSON.

>>> import json
>>>
>>> d = get_dictionary(l)
>>>
>>> print(json.dumps(d, indent=4))
{
    "A": [
        "B",
        "C",
        "D"
    ],
    "B": [
        "A"
    ],
    "C": [
        "B",
        "D"
    ],
    "D": null
}
>>>
0 голосов
/ 04 декабря 2018

Один из способов решения этой проблемы приведен ниже:

friend_combi = [['A','B'],['A','C'],['A','D'],['B','A'],['C','B'],['C','D'],['D','B'],['E']]  # Input to be processed

final_dict = {} #Empty dict to store result
for i in friend_combi: # loop through each element in list
    if final_dict.get(i[0]):  #if data present in dict then append else add
        final_dict[i[0]].append(i[1])
    else:
        final_dict[i[0]] = [i[1]] if i[1:] else None #check if value exist in list else save None
print (final_dict)
#Output --> {'A': ['B', 'C', 'D'], 'B': ['A'], 'C': ['B', 'D'], 'D': ['B'], 'E': None}

Надеюсь, это поможет:)

0 голосов
/ 04 декабря 2018

Вы можете перебирать пары ключ-значение в списке списков, но распаковывать значение как список, чтобы учесть возможное отсутствие значения:

s = [['A','B'],['A','C'],['A','D'],['B','A'],['C','B'],['C','D'],['D','B'],['E']]
output = {}
for k, *v in s:
    if v:
        output.setdefault(k, []).extend(v)
    else:
        output[k] = None

output становится:

{'A': ['B', 'C', 'D'], 'B': ['A'], 'C': ['B', 'D'], 'D': ['B'], 'E': None}

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

output = {}
for k, *v in s:
    output.setdefault(k, []).extend(v)

output станет следующим:

{'A': ['B', 'C', 'D'], 'B': ['A'], 'C': ['B', 'D'], 'D': ['B'], 'E': []}
0 голосов
/ 04 декабря 2018

Проблема заключается в том, что список, на который вы отправляете dict.keys, является только одной ссылкой на ключи.

Ваш желаемый результат противоречив.Я рекомендую вам выбрать пустой список для 'E', как бы он лучше не подходил для None.С этим скорректированным требованием вы можете использовать collections.defaultdict.

from collections import defaultdict

L = [['A','B'],['E','C'],['A','D'],['B','A'],['C','B'],['C','D'],['D','B'],['E']]

dd = defaultdict(list)

for lst in L:
    if len(lst) > 1:
        dd[lst[0]].append(lst[1])
    else:
        dd[lst[0]]

print(dd)

defaultdict(list,
            {'A': ['B', 'C', 'D'],
             'B': ['A'],
             'C': ['B', 'D'],
             'D': ['B'],
             'E': []})
0 голосов
/ 04 декабря 2018

Для инициализации dict:

output = {x[0]: [] for x in s}

dict.fromkeys вы должны использовать все ключи с одинаковым ссылочным значением.С изменяемым значением это проблема.Понимание даст каждому ключу независимый list объект, в дополнение к тому, чтобы быть более читабельным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...