我有以下嵌套循环:
for i in range(len(prices)):
for j in allCats:
if prices[i] == 1.0 and j in categories[i]:
prices[i] = allCats[j][1]
我如何重构它以提高时间复杂度/性能?
编辑:价格是浮点值列表,类别是字符串列表,allCats 是列表字典。
我有以下嵌套循环:
for i in range(len(prices)):
for j in allCats:
if prices[i] == 1.0 and j in categories[i]:
prices[i] = allCats[j][1]
我如何重构它以提高时间复杂度/性能?
编辑:价格是浮点值列表,类别是字符串列表,allCats 是列表字典。
列表推导通常比 for 循环中的等效逻辑更快,您可以找到很多关于这个主题的讨论,这些只是示例:为什么列表推导可以比 Python 中的 map() 更快?和https://www.linkedin.com/pulse/list-comprehension-python-always-faster-than-alex-falkovskiy/。
所以我的第一个想法是将你的逻辑重写为列表理解。
如果我正确理解了您的代码,您希望将价格为 1.0 的商品的价格更新为该商品的新类别价格。
项目类别在类别列表中,类别的新价格在 AllCats 字典中,您使用AllCats[j][0]
where j
is category name 检索它。
接下来,我将使用 numpy 数组创建一个基于标价的过滤器,np_filter = np_prices == 1.0
. 然后在列表推导中使用过滤器来检索更新的价格
np_prices[np_filter] = [allCats[c][0] for c in np_categories[np_filter]]
完整代码:
allCats = { 'a' : [7,2,3], 'b':[2,3,4]}
prices=[2,1.0,1.1,1.0,1.0]
categories = ['b','a','b','b','a']
import numpy as np
np_prices = np.array(prices)
np_categories = np.array(categories)
np_filter = np_prices == 1.0
np_prices[np_filter] = [allCats[c][0] for c in np_categories[np_filter]]
当然,您需要确保您的 allCats 具有类别中所有值的条目,这样您就不会遇到超出范围的错误。