python - 更新字典条目而不指定它们
问题描述
有没有办法更新或附加到字典中的所有条目以避免写出所有条目。例如考虑:
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
字典有更多条目或循环有更多条件,这可能会迅速增加大小。
解决方案
不要一直在字典中引用 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
会重复测试等),但可维护性的好处是巨大的!
推荐阅读
- dart - Flutter 模拟器个人键盘不起作用
- android - Gradle:错误:程序类型已存在:androidx.activity.R$attr
- java - 正则表达式:用空字符串替换所有无效字符
- python - 如何将一个类实例的变量存储在另一个类的实例中
- c++ - range-v3:用分隔符连接管道范围
- java - 使用 long Always 在 SQLite 中插入数据时遇到问题,返回 -1
- c++ - 使用通配符字符串作为键的高效 ID 查找
- angular - 如何使用动态路由器链接的方法
- python - 如何在嵌套的for循环中解析来自两个不同api调用的json响应?
- python - Tkinter 按钮直到鼠标悬停在它上面才显示