避免Python中的冗余循环
我有两个列表(items,sales),对于每对items,两个列表之间的sale元素,我必须调用一个函数。我正在寻找一种类似蟒蛇的方法来避免这种重复的循环 第一个循环:避免Python中的冗余循环,python,loops,for-loop,itertools,Python,Loops,For Loop,Itertools,我有两个列表(items,sales),对于每对items,两个列表之间的sale元素,我必须调用一个函数。我正在寻找一种类似蟒蛇的方法来避免这种重复的循环 第一个循环: # Create item_sales_list item_sales_list = list() for item,sales in itertools.product(items,sales): if sales > 100: item_sales_list.append([item,sales])
# Create item_sales_list
item_sales_list = list()
for item,sales in itertools.product(items,sales):
if sales > 100:
item_sales_list.append([item,sales])
result = some_func_1(item_sales_list)
第二个循环:
# Call a function with the result returned from first function (some_func_1)
for item,sales in itertools.product(items,sales):
some_func_2(item,sales,result)
如果将结果存储在列表中,并在调用
某些函数1
的站点添加条件,至少可以避免对itertools.product
的第二次调用:
item_sales_list = list(itertools.product(items, sales))
result = some_func_1([el for el in item_sales_list if el[1] > 100])
for item, sales in item_sales_list:
some_func_2(item, sales, result)
除非您可以将不完整版本的
结果
传递给某些函数2
解决方案和帧质询,否则一次传递是不可能的
首先,为了避免多次计算itertools.product()
,可以先计算一次,然后将其用于两个循环:
item_product = list(itertools.product(items, sales))
item_sales_list = [[item, sales] for item, sales in item_product if sales > 100]
第二,实际上循环两次并没有时间上的缺点(你仍然在做基本相同的工作量——相同的操作,每个操作的次数相同。所以它仍然在相同的复杂度类别中)。在这种情况下,这是不可避免的,因为您需要第一次计算的结果(需要遍历整个列表)来进行第二次计算
result = some_func_1(item_sales_list)
for item, sales in item_product:
some_func_2(item, sales, result)
如果您可以修改
某些功能2()
,使其不需要整个项目销售列表才能工作,那么您可以将其加载到相同的for
循环中,并逐个执行。如果不知道某些函数2()
是如何工作的,就不可能给出任何进一步的建议。问题在于,在完成第一个循环后,对已知结果存在依赖性。对一些函数2的功能有什么见解吗?你能为一些函数1求出一个增量解并把它和一些函数2联系起来吗?这完全取决于在一些函数2中需要怎样的结果。如果完整的结果需要放在第一位,那么在一个循环中是不可能做到的。最好是将第一个for循环更改为列表理解。您甚至不需要理解:item\u sales\u list=list(product(items,sales))
。顺便说一句:result=some\u funct\u 1(itertools.product(items,sales))
您可以简化第一个循环。尽管我在做for循环,但我正在寻找一个最佳的解决方案,使所有内容都在一个循环下。将itertools.product存储在列表中并再次循环也是一回事。@min2bro如果不知道函数的确切逻辑,这是不可能的。这是因为some_func_2
依赖于result
,不能在同一过程中生成。逻辑如下:some_func_1为列表中的每个项目执行一些逻辑,并创建一个键,然后我将结果作为这个函数的对象传递给some_func_2,它查找每个项的值,sale@min2bro某些函数2
是否需要完整版本的结果
,或者只传入一个不完整版本的result
?item\u product
是一个生成器类型的对象,因此您不能重复它两次。some\u func\u 1为列表中的每个项执行一些逻辑并创建一个键,然后我将结果作为这个函数的对象传递给some_func_2,它查找每个项的值,sale@min2bro如果您可以修改some\u func\u 1()
和some\u func\u 2()
以处理单个项目、销售
对,然后,你可以简单地一个接一个地调用它们,并将所有内容放入同一个循环中。否则,我认为这是不可能的。来自某个函数1的结果是一个项目、销售和计算值的字典,整个结果被传递到某个函数2中,该函数对项目和计算值的每个值进行查找sale@min2bro这就是为什么当你问如何解决问题时,你应该陈述最初的问题,而不是你认为的抽象问题。既然你不知道如何解决问题,那么你就不知道你漏掉的信息是否相关。