【发布时间】:2013-05-30 22:21:06
【问题描述】:
所以我必须遍历一个对象列表,使用它们的一些值进行计算,然后为它们分配新值。
因为列表中的许多项目都将被分配相同的新值,所以我使用字典来保存需要相同值的项目列表。例如:
item_dict = {}
for item in list:
value = item.value
if value not in item_dict:
item_dict[value] = [item]
else:
item_dict[value].append(item)
# do some calculations base on values
new_data # some dictionary created by computation
# new data is stored new_data[value] = new_value
for value, new_value in new_data.items():
items = item_dict[value]
for item in items:
item.value = new_value
我正在考虑使用装饰器删除 items 循环中的 for 项目,因为该列表的所有 new_value(s) 都是相同的。例如:
def dec(item):
def wrap(value):
item.value = value
return wrap
def rec(item, func):
def wrap(value):
item.value = value
func(value)
return wrap
item_dict = {}
for item in list:
value = item.value
if value not in item_dict:
item_dict[value] = dec(item)
else:
item_dict[value] = rec(item, item_dict[value])
# do some calculations base on values
new_data # some dictionary created by computation
# new data is stored new_data[value] = new_value
for value, new_value in new_data.items():
items = item_dict[value]
items(new_value)
装饰时尚会更有效率吗?它会对记忆产生多大的影响?有没有更好的方法来做到这一点?
【问题讨论】:
-
rec函数,乍一看,就像一个无操作。它的目的是什么? -
哎呀,让我来解决这个问题
-
您需要
items_dict进行计算吗?如果您只需要根据new_data更新所有项目值,我认为只需遍历您的列表一次,每次都查找新值会更清楚。字典查找速度很快。 -
@PeterDeGlopper 我实际上是从项目中存储通用对象的 id 值以执行像 GenericModel.objects.filter(id__in=values) 这样的查询,所以我需要遍历所有项目以获取首先是所有 id,以便我可以执行查询。所以 new_data 将是 new_data[content_type] = [list of queried content objects]
-
你的意思是
item_dict而不是new_data吗?对于每种内容类型,您的原始代码在new_data中只有一个值。我仍然认为构建item_dict是不必要的 - 您至少为每个项目插入一个字典,以便以后可以减少字典查找的数量,但是直接迭代您的项目列表只会进行一次字典查找每个项目。
标签: python