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

Sah*_*yar 6 python dictionary list python-3.x

我需要编写一个函数来接受代表每个人朋友的列表列表,并需要将其转换为字典.所以输入[['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']]
Run Code Online (Sandbox Code Playgroud)

预期产出:

{A:[B,C,D],B:[A],C:[B,D],D:[B],E:None}
Run Code Online (Sandbox Code Playgroud)

目前我正在尝试以下方法:

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)
Run Code Online (Sandbox Code Playgroud)

但是输出给了我每个键的所有值,而不是只返回相应的值

我得到的输出是:

{
'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]
}
Run Code Online (Sandbox Code Playgroud)

blh*_*ing 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
Run Code Online (Sandbox Code Playgroud)

output变成:

{'A': ['B', 'C', 'D'], 'B': ['A'], 'C': ['B', 'D'], 'D': ['B'], 'E': None}
Run Code Online (Sandbox Code Playgroud)

或者,如果您不介意没有值的键得到一个空列表而不是None,您可以简单地执行以下操作:

output = {}
for k, *v in s:
    output.setdefault(k, []).extend(v)
Run Code Online (Sandbox Code Playgroud)

output那么就会变成:

{'A': ['B', 'C', 'D'], 'B': ['A'], 'C': ['B', 'D'], 'D': ['B'], 'E': []}
Run Code Online (Sandbox Code Playgroud)