我正在尝试根据两个列表中的公共值组合(2)2D列表。
列表中的值是唯一的,因此无需考虑具有任何相同值的列表条目。
示例是:
list1 = [['hdisk37', '00f7e0b88577106a']]
list2 = [['1', '00f7e0b8cee02cd6'], ['2', '00f7e0b88577106a']]
具有所需的结果:
list3 = [['hdisk37', '00f7e0b88577106a','2']]
常见值在list1 [0] [1]和list2 [1] [1]。
答案 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