今天引起了一些严重的头痛。 假设我有两个我的对象实例,实例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相同。
有任何帮助吗?
答案 0 :(得分:4)
您可以使用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]
使用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]]