在Python中匹配和组合多个2D列表

在Python中匹配和组合多个2D列表,python,Python,我试图根据两个列表中的公共值组合(2)个2D列表 列表中的值是唯一的,因此对于具有任何相同值的列表条目,不需要考虑任何内容 例如: list1 = [['hdisk37', '00f7e0b88577106a']] list2 = [['1', '00f7e0b8cee02cd6'], ['2', '00f7e0b88577106a']] 达到了预期的效果: list3 = [['hdisk37', '00f7e0b88577106a','2']] 公共值位于列表1[0][1]和列表2[1]

我试图根据两个列表中的公共值组合(2)个2D列表

列表中的值是唯一的,因此对于具有任何相同值的列表条目,不需要考虑任何内容

例如:

list1 = [['hdisk37', '00f7e0b88577106a']]
list2 = [['1', '00f7e0b8cee02cd6'], ['2', '00f7e0b88577106a']]
达到了预期的效果:

list3 = [['hdisk37', '00f7e0b88577106a','2']]
公共值位于列表1[0][1]和列表2[1][1]。

请尝试以下操作:

result = []
for inner_list1 in list1:
    for inner_list2 in list2:
        set1 = set(inner_list1)
        set2 = set(inner_list1)
        if set1.intersection(set2):
            result.append(list(set1.union(set2)))
对于两个列表中的每个内部列表,检查它们之间的交点是否为空。如果不是,它们将合并并添加到最终结果中。

使用
set
对象获得所需结果的python方法:

list1 = [['hdisk37', '00f7e0b88577106a']]
list2 = [['1', '00f7e0b8cee02cd6'], ['2', '00f7e0b88577106a']]

set1 = set(list1[0])
list3 = [list(set1 | s) for s in map(set, list2) if set1 & s]
print(list3)
输出:

[['00f7e0b88577106a', '2', 'hdisk37']]
  • set1&s
    是两个集合的交集(返回一个包含第一个集合和所有其他集合共有的元素的新集合)

  • set1 | s
    是指定集合的并集


此方法将所有可能的“第二个值”匹配作为dict返回,从第二个值到结果列表。它还需要任意数量的列表(而不仅仅是两个)

输出:

$ python test.py 
{'00f7e0b8cee02cd6': ['00f7e0b8cee02cd6', '1'], '00f7e0b88577106a': ['hdisk37', '2', '00f7e0b88577106a']}
要获得请求的确切输出,您需要执行以下操作:

combine(list1, list2).get('00f7e0b88577106a')

如果你想尝试不同的东西,你可以

merger = lambda x,y : set(x)|set(y) if set(x)&set(y) else x
results = []
for item in list1:
    result = reduce(merger,[item]+list2)
    if isinstance(result,set):
        results.append(result)

print results

因此,最终输出必须只包含具有共同元素的列表的合并?该如何查看此输入的结果:
list1=[['a','b'],['d','f'],['a','e']]list2=[['c','d'],['e','b']
?对不起,我应该已经澄清了。我将始终尝试匹配列表的第二个元素。因此始终
listm[k][1]
列表n[p][1]
同样,匹配的值总是唯一的。我将给出我的实际示例,让它更清楚。
['hdisk37','00f7e0b88577106a'][['1','00f7e0b8cee02cd6'],['2','00f7e0b88577106a']
期望的结果:
['hdisk37','00f7e0b88577106a','2']
所有字段在其列表中都是唯一的。@user3552459,请编辑您的问题,粘贴新的有效示例。谢谢Roman。我将为将来研究此信息。非常感谢。
merger = lambda x,y : set(x)|set(y) if set(x)&set(y) else x
results = []
for item in list1:
    result = reduce(merger,[item]+list2)
    if isinstance(result,set):
        results.append(result)

print results