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

5

我有两个嵌套列表

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]匹配,如果匹配,则输出[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')]]

1
你有没有考虑使用 dict 来查找你要搜索的内容? - Alfe
你可以用一行代码实现,但是看起来很糟糕。 - cs95
@cᴏʟᴅsᴘᴇᴇᴅ 有多糟糕? - Sohaib Farooqi
@Alfe 抱歉,不确定如何在这里使用 dict - Sohaib Farooqi
[next(([1, x[0], y[0]] for y in l2 if x[0] == y[-1]), [0, x[0], l2[-1][0]]) for x in l1] - cs95
显示剩余4条评论
2个回答

4

看起来你没有使用所有的元素。不过,我会用l2建立一个字典,以便快速查找和简洁(可能可以用一行代码完成,但会牺牲可读性和性能)。

我会在列表推导式中加入三元运算符,根据是否找到项目来发出2或3个元素(因此不需要花哨的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]]

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

我已经更新了我的问题。如果没有匹配,i[0] 将是输出。 - Sohaib Farooqi

1
更好的方式是建立一个字典来加快搜索速度。
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]]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接