Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
避免Python中的冗余循环_Python_Loops_For Loop_Itertools - Fatal编程技术网

避免Python中的冗余循环

避免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])

我有两个列表(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])

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这就是为什么当你问如何解决问题时,你应该陈述最初的问题,而不是你认为的抽象问题。既然你不知道如何解决问题,那么你就不知道你漏掉的信息是否相关。