如何合并 2 个嵌套列表

How to merge 2 nested lists

提问人:Hesta 提问时间:7/26/2023 最后编辑:Hesta 更新时间:7/29/2023 访问量:61

问:

我想合并 2 个列表:

list1 = ['a', ['b', ['c', ['lol', [{'s': '21'}]]]]]
list2 = ['a', ['f', ['d', [{'x': '22'}]]]]]

预期结果:

['a', ['b', ['c', ['lol', [{'s': '21'}]]]], ['f', ['d', [{'x': '22'}]]]]

我试着按键获取,但我没有得到我所期望的。

python-3.x 嵌套 嵌套列表

评论

0赞 mkrieger1 7/26/2023
“tried get by key” 是什么意思?
1赞 mkrieger1 7/26/2023
我认为 list2 和预期结果都没有平衡括号,请再次检查。
0赞 Hesta 7/26/2023
尝试通过键获取 ->我的意思是递归函数,例如 list2 中的键:如果 list1 中的键:此处的递归等
0赞 Iain D 7/26/2023
您的意思是从 list2 中删除第一个“a”,否则肯定只有 list3 = list1 + list2 给出了所需的结果?
0赞 Hesta 7/26/2023
@IainD在这个例子中是的,但我想要通用函数

答:

0赞 Nadir Belhaj 7/26/2023 #1

您需要创建一个函数,以递归方式运行列表并将其元素合并在一起

def merge(list1, list2):
    if not list1:
        return list2
    if not list2:
        return list1

    merged_list = []

    if isinstance(list1[0], list) and isinstance(list2[0], list):
        merged_list.append(merge(list1[0], list2[0]))
    else:
        merged_list.append(list1[0])

    merged_list.extend(merge(list1[1:], list2[1:]))

    return merged_list

list1 = ['a', ['b', ['c', ['lol', [{'s': '21'}]]]]]
list2 = ['a', ['f', ['d', [{'x': '22'}]]]]

merged = merge(list1, list2)
print(merged)

评论

0赞 Hesta 7/26/2023
此函数的结果是 ['a', ['b', ['c', ['lol', [{'s': '21'}]]]]] 它丢失了 ['f', ['d', [{'x': '22'}]]]
0赞 Ariel Carvalho 7/26/2023 #2

上面的答案无法处理将列表元素扩展到第二个列表。

def merge_lists(list1, list2):
    if not list1:
        return list2
    if not list2:
        return list1

    merged_list = []
    if isinstance(list1[0], list) and isinstance(list2[0], list):
        merged_list.extend([merge_lists(list1[0], list2[0])])
    else:
        merged_list.extend([list1[0]])

    merged_list.extend(merge_lists(list1[1:], list2))
    return merged_list

希望对你有所帮助!:D

0赞 Alain T. 7/29/2023 #3

我不清楚您打算如何识别嵌套级别的重复项,但在第一级,您可以使用列表推导式来过滤第二个列表中的项目,不包括第一个列表中的项目:

list1 = ['a', ['b', ['c', ['lol', [{'s': '21'}]]]]]
list2 = ['a', ['f', ['d', [{'x': '22'}]]]]

list3 = list1 + [i for i in list2 if i not in list1 ]

print(list3)
['a', ['b', ['c', ['lol', [{'s': '21'}]]]], ['f', ['d', [{'x': '22'}]]]]