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

时间:2016-12-07 19:37:12

标签: python

我正在尝试根据两个列表中的公共值组合(2)2D列表。

列表中的值是唯一的,因此无需考虑具有任何相同值的列表条目。

示例是:

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

具有所需的结果:

list3 = [['hdisk37', '00f7e0b88577106a','2']]

常见值在list1 [0] [1]和list2 [1] [1]。

4 个答案:

答案 0 :(得分:0)

试试这个:

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

对于两个列表中的每个内部列表,检查它们之间的交集是否为空。如果不是,则将它们合并并添加到最终结果中。

答案 1 :(得分:0)

使用set对象获取所需结果的 pythonic方式

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是指定集合的​​ union

答案 2 :(得分:0)

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

import collections

a = [['hdisk37', '00f7e0b88577106a']]
b = [['1', '00f7e0b8cee02cd6'], ['2', '00f7e0b88577106a']]

def combine(*lols): # list of lists
  ret = collections.defaultdict(set)
  for lol in lols:
    for l in lol:
      ret[l[1]].add(l[1])
      ret[l[1]].add(l[0])
  return {k:list(v) for k,v in ret.items()}

print combine(a,b)

输出:

$ python test.py 
{'00f7e0b8cee02cd6': ['00f7e0b8cee02cd6', '1'], '00f7e0b88577106a': ['hdisk37', '2', '00f7e0b88577106a']}

要获得您要求的确切输出,您需要:

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

答案 3 :(得分:0)

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

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