python - 使用装饰器与迭代来设置值?

标签 python

所以我必须遍历对象列表,使用它们的一些值进行计算,然后为它们分配新值。

因为列表中的许多项目将被分配相同的新值,所以我使用字典来保存需要相同值的项目列表。例如:

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

我正在考虑使用装饰器删除 for item in items 循环,因为该列表的所有 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)

装饰器时尚会更高效吗?它会对内存产生多大影响?有没有更好的方法来做到这一点?

最佳答案

defaultdict 在这里工作得很好:

from collections import defaultdict

item_dict = defaultdict(list)

for item in value_list:
    item_dict[item.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():
    for item in item_dict[value]:
        item.value = new_value

我很难想出装饰器版本可以更好的方法 - 一方面,您必须担心递归限制。

关于python - 使用装饰器与迭代来设置值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16846784/

相关文章:

python - 如果满足条件,则更改值,数据框

python - python中的循环卷积

python - BigQuery 执行时间

python - 简单逻辑错误(组织列表)

python - 你能解释一下这是如何工作的吗?

python - 在 python 中使用 IOT 适配器和 google pub/sub api 将 MQTT 与 GCP 集成

python - 远程 API 非常慢

python - Range 类的 AutoFilter 方法失败(Dispatch 与 EnsureDispatch)

从 python32 进行 Python 打印

python - 合并两个 QuerySets 或重新排序一个 QS,使得每个第 n 个元素都来自第二个