繁体   English   中英

比较一个嵌套列表的元素和另一个嵌套列表的元素

[英]Compare elements of one nested list with another nested list

我有两个清单

l1 = [[1,2,3],[4,5,6],[7,8,9]]
l2 = [['a','b',4],['c','d',1],['e','f',12],['i','j',18]]

我想遍历l1并检查l1[0]任何 l2[2] l1[0]匹配,在这种情况下,输出应为[1, l1[0],l2[0]]否则输出为[0, l1[0], l2[0]] 输出应该是一个嵌套列表(或元组列表),每个l1结果都应包含结果。 两个列表的大小可以不同。

我试图用for循环来解决这个问题:

output = list()
for i in l1:
   matched = 0
   for j in l2:
       if j[2] == i[0]:
          output.append([1,i[0], j[0]])
          matched = 1
    if matched == 0:
       output.append([0,i[0]])

这给出正确的输出

[[1, 1, 'c'], [1, 4, 'a'], [0, 7]]

但是,我正在寻找更紧凑的解决方案。 是否可以通过类似的列表理解来解决此问题,从而减少涉及的行数?

我尝试了嵌套列表理解,但无法正常工作

out = [[(1,i[0],k[0]) if(k[2] == i[0]) else (0,i[0],k[0]) for k in l2] for i in l1]
print(out)
[[(0, 1, 'a'), (1, 1, 'c'), (0, 1, 'e'), (0, 1, 'i')], [(1, 4, 'a'), (0, 4, 'c'), (0, 4, 'e'), (0, 4, 'i')], [(0, 7, 'a'), (0, 7, 'c'), (0, 7, 'e'), (0, 7, 'i')]]

似乎您并未使用所有元素。 但是,我会根据l2来构建一个字典,以进行快速查找和简洁化(可能有可能使用单行代码,但是会牺牲可读性和性能)

接下来,我将使用列表解析,包括三元数,以根据是否找到该项目来发布2或3个元素(因此,不需要花哨的int(if a in l2d)为a int(if a in l2d)因为我们可以直接发布0或1)。 像这样:

l1 = [[1,2,3],[4,5,6],[7,8,9]]
l2 = [['a','b',4],['c','d',1],['e','f',12],['i','j',18]]

l2d = {v[2]:v[0] for v in l2}  # not using v[1]

result = [[1,a,l2d[a]] if a in l2d else [0,a] for a,_,_ in l1]  # using only first element of each l1 triplet...

结果:

[[1, 1, 'c'], [1, 4, 'a'], [0, 7]]

(请注意,携带其他未使用的物品并不能真正帮助您理解问题)

更好地构建字典以加快搜索速度。

d = { c: a for [a,b,c] in l2 }

现在您可以使用:

[[int(a in d), a] + ([d[a]] if a in d else [])
 for a,b,c in l1]

这返回

[[1, 1, 'c'], [1, 4, 'a'], [0, 7]]

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM