我有两个列表(项目,销售),对于每对项目,两个列表之间的销售元素必须调用一个函数。我正在寻找一种避免这种冗余循环的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)
答案 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
的工作方式,就不可能给出任何进一步的建议。