python中的多维列表匹配
这在今天引起了一些严重的头痛。 假设我的对象有两个实例,实例A和实例B。它们都带有列表形式的属性。假设A的两个属性是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中找到了最后的条目。对于指数
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能理解你的答案吗?