Python:两个列表列表中的匹配列表

时间:2016-09-06 18:21:21

标签: python join list

我有两个列表列表。第一个由格式如下的列表组成:

listInA = [id, a1, a2, a3]

第二个由类似格式的列表组成,其中id为:

listInB = [id, b1, b2, b3]

两个列表都没有排序,它们的长度不相同。制作列表列表的最佳方法是什么,每个列表都包含以下格式:

listInC = [id, a1, a2, a3, b1, b2, b3]

两个列表之间的id匹配?谢谢!

2 个答案:

答案 0 :(得分:3)

您可以使用dict comprehension从ID到列表的第二个列表列表创建字典。然后,使用列表推导创建新列表,根据ID附加列表。

listA = [
    [1, 'a', 'b', 'c'],
    [2, 'd', 'e', 'f'],
]
listB = [
    [2, 'u', 'v', 'w'],
    [1, 'x', 'y', 'z'],
]

b_map = {b[0]: b for b in listB}
print([a + b_map[a[0]][1:] for a in listA])

<强>输出:

[
    [1, 'a', 'b', 'c', 'x', 'y', 'z'],
    [2, 'd', 'e', 'f', 'u', 'v', 'w']
]

答案 1 :(得分:0)

列表未排序且长度不等的事实增加了提出有效解决问题的难度。然而,最终可行的快速而肮脏的解决方案仍然是可行的。

ID似乎是两个列表中的第一个。既然如此,那么对于a中的每个列表A,我们都可以获得a的第一个元素并检查b中的列表B。如果第一个元素匹配,那么我们可以创建一个列表,其中包含ab的其余元素,并将其附加到C。简而言之......

def foo(A, B):
   C = []
   for a in A:
      aID = a[0]
      for b in B:
         if aID == b[0]:
            c = [aID, a[1], a[2], a[3], b[1], b[2], b[3]]
            C.append(c)
   return C

在处理AB的大型列表大小时,此解决方案的效率会大幅下降,但它应适用于合理大小的列表。