gpt4 book ai didi

python - 在 Python 中比较对象时避免嵌套循环

转载 作者:太空宇宙 更新时间:2023-11-03 23:54:09 25 4
gpt4 key购买 nike

我得到了两段代码,它们是由不同的人在不同的时间编写的,并且都可以单独运行。我的工作是比较这两段代码的输出。我还需要检查某些字段中没有任何错误。

脚本 1 返回一个 Script1Object 列表,每个对象都有自己的属性。类似地,脚本 2 返回一个 Script2Object 列表,它们与 Script1Object 类似但并不完全相同。

我的代码是这样的:

script1_list = script1()
script2_list = script2()

for item1 in script1_list:
for item2 in script2_list:
if is_match(item1, item2):
do_matching_action()
break
elif is_different_match(item1, item2):
do_other_matching_action()
break

if is_bad(item1):
do_error_action()

其中 is_match() 匹配大约十个不同的属性。例如:

def is_match(item1, item2):
return item1.name == item2.name and item1.ID == item2.number and item1.description.startswith(item2.desc)

is_different_match()is_bad() 有一组相似的检查。

这工作正常但速度可能很慢,尤其是当第一个列表可能有数十万个条目而第二个列表很容易有数千个时。代码也不是很模块化,所以我希望避免双重 for 循环会提高代码的可扩展性。我想知道如何改进这个实现,因为我确信这没有充分利用 Python 的特性。

最佳答案

鉴于匹配对象必须具有相似的 ID(Script1Object 中的 IDScript2Object 中的 number),并假设 script2_list 项都具有唯一的 number,您可以使用 dictionary 创建从 number 到对象的映射.然后,在迭代时,您可以直接通过 number 从字典中获取 Script2Object(无需遍历整个 script2_list ).然后,您可以像以前一样在两个对象上调用每个匹配函数:

script1_list = script1()
script2_list = script2()
script2_dict = {obj.number: obj for obj in script2_list}

for item1 in script1_list:
item2 = script2_dict.get(item1.ID, None)
if item2 is None:
print('no item2 found for this id: ', item1.ID)
# do something if there's no matching id
if is_match(item1, item2):
do_matching_action()
elif is_different_match(item1, item2):
do_other_matching_action()

if is_bad(item1):
do_error_action()

关于python - 在 Python 中比较对象时避免嵌套循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58399797/

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