首页 > 解决方案 > 更新字典条目而不指定它们

问题描述

有没有办法更新或附加到字典中的所有条目以避免写出所有条目。例如考虑:

records = {'a': [], 'b': [], 'c': []}

for i in range(0, 10):
    if i % 2 == 0:
        records['a'].append(i)
        records['b'].append(i**2)
        records['c'].append(i**4)
    else:
        records['a'].append(i)
        records['b'].append(i**3)
        records['c'].append(i**5)

这并不难读,但如果records字典有更多条目或循环有更多条件,这可能会迅速增加大小。

标签: pythondictionary

解决方案


不要一直在字典中引用 3 个单独的列表。如果要在代码的所有分支中添加所有三个目标,则只需在单个列表中收集元组。您始终可以将它们转回单独的列表中:

entries = []

for i in range(10):
    if i % 2 == 0:
        entries.append((i, i ** 2, i ** 4))
    else:
        entries.append((i, i ** 3, i ** 5))

records = dict(zip('abc', zip(*entries)))

如果需要,该循环也可以转换为列表理解。

另一种选择是使用局部变量来引用这些列表;您在这里有 3 个固定目标是可变的,因此创建固定数量的本地人是微不足道的,并且已经为您节省了大量的样板:

a, b, c = records['a'], records['b'], records['c']
# use a, b and c inside your loops

另一种选择是为每个目标分派到单独的函数:

def a_from_i(i):
    return i

def b_from_i(records, i):
    return i ** 2 if i % 2 == 0 else i ** 3

def c_from_i(records, i):
    return i ** 4 if i % 2 == 0 else i ** 5

records = {'a': [], 'b': [], 'c': []}
dispatchers = {'a': a_from_i, 'b': b_from_i, 'c': c_from_i}

for i in range(10):
    for key, handler in dispatchers.items():
        records[key].append(handler(i))

这在这里可能有点过头了,但是随着问题的复杂性增加,为每个字典条目使用单独的函数可以让您专注于您在单独的代码单元中构建的每种类型的数据点,这些代码单元可以自行测试。

如果您以后需要轻松扩展和添加处理程序,则可以将装饰器添加到调度程序注册表中,而不是像我上面使用的硬编码字典。虽然使用调度模式可能会慢一些(函数调用有开销,在每个函数中重新测试i会重复测试等),但可维护性的好处是巨大的!


推荐阅读