python中的多维列表匹配

python中的多维列表匹配,python,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]=5和b2[0]=50 我们在a1和a2中找到了最后的条目。对于指数

这在今天引起了一些严重的头痛。 假设我的对象有两个实例,实例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]=5
b2[0]=50

我们在a1和a2中找到了最后的条目。对于指数2,我们在(b1,b2)中找到(3,30),它也在(a1,a2)中

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


有什么帮助吗 我认为另一种结构会更好

元组或键集

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

编辑


嗯。。。tobias_k向您展示了如何:)

我认为另一种结构会更好

元组或键集

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

编辑


嗯。。。tobias_k向您展示了如何:)

您可以结合使用
zip
set
enumerate

>>> 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]

使用,可以将这些对分组在一起,使用
set
可以将它们转换为一个集合,因为顺序无关紧要,而set具有更快的查找速度。然后,为您提供成对的索引和元素,并使用列表理解从
b12
获取这些索引,这些索引的元素位于
a12

中,您可以使用
zip
set
enumerate
的组合:

>>> 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]
使用,可以将这些对分组在一起,使用
set
可以将它们转换为一个集合,因为顺序无关紧要,而set具有更快的查找速度。然后,为您提供成对的索引和元素,使用列表理解,您可以从
b12
获取这些索引,这些索引的元素位于
a12

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]
试试这个

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]

还可以检查(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]
给予


还可以检查(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]
给予


你能添加一些解释以便OP能理解你的答案吗?你能添加一些解释以便OP能理解你的答案吗?