我得到了两段代码,这两段代码是由不同的人在不同的时间编写的,它们各自都能很好地工作。我的工作是比较这两段代码的输出。我还需要检查某些字段中是否有任何错误。你知道吗
脚本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()
匹配大约10个不同的属性。例如:
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的特性。你知道吗
我的想法和@slider是一样的,但是你可能会喜欢我的方法。它使用相同的逻辑,首先从第二个脚本中找到列表中的
ID
。你知道吗主要的区别是我使用了列表理解,使代码更加紧凑,并避免使用elif。它还跟踪输出列表中不同的匹配元素,以防以后需要访问它们。你知道吗
假设匹配对象必须具有相似的id(
Script1Object
中的ID
和Script2Object
中的number
),并且假设script2_list
项都具有唯一的number
,您可以使用dictionary创建从number
到对象的映射。然后,当您进行迭代时,您可以通过字典的number
直接从字典中获得一个Script2Object
(而不必遍历整个script2_list
)。然后可以像以前一样调用两个对象上的每个匹配函数:相关问题 更多 >
编程相关推荐