python中的多维列表匹配

时间:2015-03-26 19:41:33

标签: python

今天引起了一些严重的头痛。 假设我有两个我的对象实例,实例A和实例B.这些带有属性的是列表的形式。假设A的两个属性是

a1 = [1, 2, 3, 4, 5]
a2 = [10, 20, 30, 40, 50]

和B的那些:

b1 = [5, 7, 3, 1]
b2 = [50, 20, 30, 20]

我想要的是简单地找到b1和b2中的索引,其中一对等于a1和a2中的值。所以在这个例子中,这将是指数0和2,因为对于那些我们有

的人

b1[0] = 5b2[0] = 50

我们在a1和a2中找到最后的条目。对于索引2也是如此,我们在(b1,b2)中找到(3,30),它也在(a1,a2)中。

请注意,列表a1和a2的长度始终与b1和b2相同。

有任何帮助吗?

4 个答案:

答案 0 :(得分:4)

您可以使用zipsetenumerate的组合:

>>> a1 = [1, 2, 3, 4, 5]
>>> a2 = [10, 20, 30, 40, 50]
>>> b1 = [5, 7, 3, 1]
>>> b2 = [50, 20, 30, 20]
>>> a12 = set(zip(a1, a2))
>>> [i for i, e in enumerate(zip(b1, b2)) if e in a12]
[0, 2]

使用zip,您可以将这些对分组在一起,然后使用set将它们转换为一个集合,因为顺序无关紧要,并且设置的查找速度更快。然后,enumerate为您提供索引和元素对,并使用列表推导法从b12得到那些元素位于a12的索引。

答案 1 :(得分:0)

我认为另一种结构会更好吗?

元组或键集......

a = [(1,10),(2,20)]等等

修改

好吧... tobias_k告诉你如何:)

答案 2 :(得分:0)

试试这个

In [38]: [b1.index(i[0]) for i in zip(a1,a2) for j in zip(b1,b2) if i==j]
Out[38]: [2, 0]

答案 3 :(得分:0)

还有可能检查(a1,a2)中的每个元素是否在(b1,b2)中并且它将返回列表中的所有匹配并且将处理重复:

a1 = [1, 2, 3, 4, 5]
a2 = [10, 20, 30, 40, 50]

b1 = [5, 7, 3, 1, 5]
b2 = [50, 20, 30, 20, 50]

# Construct list of tuples for easier matching
pair_a = [(i, k) for i, k in zip(a1, a2)]
pair_b = [(i, k) for i, k in zip(b1, b2)]

# Get matching indices (for each entry in pair_a get the indices in pair_b)
indices = [[i for i, j in enumerate(pair_b) if j == k] for k in pair_a]

给出

[[], [], [2], [], [0, 4]]