避免在Python中进行冗余循环

时间:2019-07-31 17:12:53

标签: python loops for-loop itertools

我有两个列表(项目,销售),对于每对项目,两个列表之间的销售元素必须调用一个函数。我正在寻找一种避免这种冗余循环的pythonic方法

第一个循环:

# 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)

2 个答案:

答案 0 :(得分:2)

至少在将结果存储在列表中的情况下,您可以避免再次调用itertools.product,并在some_func_1的呼叫站点添加条件:

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)

除非您可以将result的不完整版本传递给some_func_2,否则不可能一pass而就。

答案 1 :(得分:0)

解决方案和框架挑战。

首先,为避免多次计算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)

如果您可以修改some_func_2()以使其不需要 entire item_sales_list才能正常工作,则可以将其加载到相同的{{1}循环执行,然后一个接一个地执行。如果不知道for的工作方式,就不可能给出任何进一步的建议。