[英]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.