gpt4 book ai didi

python - 通过元组属性过滤两个对象列表

转载 作者:行者123 更新时间:2023-11-28 21:14:33 25 4
gpt4 key购买 nike

我有两个列表对象,我只想要 list1 中的那些元素,其属性元组与 list2 中的元组属性相匹配:

list1= [ojec1, objec2, objec3,....]

list2=[fig1,fig2,fig3,...]

for i in range (len(list1)):
for j in range (len(list2)):
if (list1[i].attr1==list2[j].attr1 & list1[i].attr2==list2[j].attr2):
...

有没有更快的方法??

最佳答案

由于嵌套的 for 循环,您的原始代码需要 O(N**2) 步骤 ( quadratic time ) 来查找匹配元素。

它还使用 range(len(...)) 和数字索引,只需遍历元素即可清除这些索引! (有关解释,请参阅 first example here)

此外,对于“逻辑与”,您需要使用 and 运算符,而不是 &(正如 Kasra 所说,它用于“按位与”)。

因此,为了使它更简洁、更高效(O(N),线性时间),我将执行以下操作:

  • 遍历两个列表
  • 制作一个你想要匹配的属性的元组
  • 使用字典来跟踪所有具有匹配元组的对象

代码如下:

class Something(object):
def __init__(self, a, b):
self.a = a
self.b = b
def __repr__(self):
return "Something(%s, %s)" % (self.a, self.b)

l1 = [Something(1,1), Something(1,2), Something(1,3)]
l2 = [Something(1,2), Something(2,2), Something(3,2)]

matches = {}
for obj in l1 + l2:
k = (obj.a, obj.b)
if k not in matches:
matches[k] = []
matches[k].append(obj)

for m in matches:
if len(matches[m]) > 1:
print "Match:", matches[m]

输出:

Match: [Something(1, 2), Something(1, 2)]

关于python - 通过元组属性过滤两个对象列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31510067/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com