将列表列表转换为具有多个键值的字典

时间:2018-12-03 22:03:00

标签: python python-3.x list dictionary

我需要编写一个函数,该函数接受代表每个人朋友的列表的列表,并将其转换为字典。 因此输入[['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 :(得分:1)

您可以遍历列表列表中的键/值对,但是可以将值作为列表解压缩以容纳可能缺少的值:

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': []}

答案 1 :(得分:0)

您应该使用普通的dict理解来启动dict

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

dict.fromkeys为所有键赋予相同的参考值。可变值是个问题。理解力将使每个键具有独立的list对象,并且更具可读性。

答案 2 :(得分:0)

问题在于您提供给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': []})

答案 3 :(得分:0)

解决此问题的方法之一如下:

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}

我希望这会有所帮助:)

答案 4 :(得分:0)

您可以定义一个名为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
}
>>>