将列表与列表进行比较

时间:2020-02-25 01:38:31

标签: python list dictionary

我有一个列表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': []
}

2 个答案:

答案 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)