我有一个列表string_array = ['1', '2', '3', '4', '5', '6']
和一个列表列表
multi_list = [['1', '2'], ['2', '3'], ['2', '4'], ['4', '5'], ['5', '6']]
multi_list
中每个子列表的第一个元素在string_array
中都有一个关联的条目。
(子列表中没有重复的元素)
如何将这些相关元素映射到字典中,如:
{
'1': ['2'],
'2': ['3', '4'],
'3': [],
'4': ['5'],
'5': ['6'],
'6': []
}
答案 0 :(得分:2)
以下一些概念可以为您提供帮助,但是我不会为您提供完整的解决方案。您应该自己这样做以陷入概念中。
制作一个空的列表字典
two
您可以使用for循环:
{
'1': [],
'2': [],
'3': [],
'4': [],
'5': [],
'6': [],
}
您还可以看中并使用字典理解:
list_one = ['1', '2', '3', '4', '5', '6']
my_dict = {}
for value in list_one:
my_dict[value] = []
现在,您需要遍历第二个列表,并my_dict = {value: [] for value in list_one}
到当前列表。例如要添加到列表中,您可以通过以下几种方式进行操作:
append
要分割列表,可以使用切片符号:
a = [1,2]
b = [3,4]
c = 5
# add a list to a list
a += b
# now a = [1,2,3,4]
# add a list to a list
b.append(c)
# now b = [3,4,5]
要访问词典中的项目,您可以这样操作:
a = [1,2,3,4]
b = a[:2]
c = a[2:]
# now b = [1,2], and c = [3,4]
答案 1 :(得分:-1)
flat = ['1', '2', '3', '4', '5', '6']
nested = [['1', '2'], ['2', '3'], ['2', '4'], ['4', '5'], ['5', '6']]
result = {key: [] for key in flat}
for key in result:
result[key] = [nest[1] for nest in nested if key == nest[0]]
#{'1': ['2'], '2': ['3', '4'], '3': [], '4': ['5'], '5': ['6'], '6': []}
使用平面列表元素作为键,可以生成字典并使用空列表作为值。如果以后使用列表理解来生成值,则空字符串或None
也将起作用。
然后只需遍历字典中的键和嵌套列表即可将结果附加到适当的键上。
此外;
您可以将上述内容简化为输出相同结果的一行。
result = {key: [nest[1] for nest in nested if key == nest[0]] for key in flat}
输出:
{'1': ['2'], '2': ['3', '4'], '3': [], '4': ['5'], '5': ['6'], '6': []}
编辑:
在评估了Juanpa的注释并测试了上述代码的效率之后,很明显,遇到大型数据集时,有更好的方法来运行它。
评论以供参考:
此解决方案是O(N * M),其中N和M是平面和嵌套的大小。您可以在O(MAX(N,M))中执行此操作。基本上,循环遍历嵌套而不是结果,并在嵌套中执行a,b:result [a] .append(b)
运行上述代码1000次,在平面列表中有1000个元素,在嵌套中有1000个嵌套列表。
print(t.timeit(1000))
39.37227249999978
但是,使用下面的代码运行它具有更高的运行时间。
print(j.timeit(1000))
0.17638869999973394
代码:
result = {key: [] for key in flat}
for a, b in nested:
if a in result:
result[a].append(b)