python - 以最佳方式从字典中删除所有值
问题描述
我有一本像这样的字典:
z = {'d': '2018', 'uc': '609', 'bc': 'HSBC', 'ab': 'FICCL', .... }
它有 57 个键值对。我想保留键但删除值并使它们像“”这样的空字符串。我尝试了以下代码:
for k,v in z.items():
z[k] = ""
我得到了所需的输出,例如:
z = {'d': '', 'uc': '', 'bc': '', 'ab': '', .... }
我想知道这是否是一次删除字典中所有值的最简单方法。还有其他方法吗?是否有任何内置功能可以做到这一点?有没有没有任何循环的单线?
解决方案
如果您需要就地更新字典,则必须遍历键,因此您的方法是一个很好且可读的方法。它也比更新字典的替代方法更快,甚至使用相同的键创建新字典!
您可以挂断items()
电话,您对这些值不感兴趣。只需直接遍历字典即可获取键:
for k in z:
z[k] = ""
另一种方法是用于dict.fromkeys()
创建一个新的空字典。要就地更新现有字典(因此对同一字典的其他引用会看到更改),您可以调用z.update()
传入新字典:
# set all values to an empty string, in place
z.update(dict.fromkeys(z, ""))
缺点是您可能需要包含注释来解释该行应该实现的目标。它也较慢,因为创建新对象只是为了更新现有对象。此外,您要小心使用dict.fromkeys()
,因为第二个参数是可用于所有键的单个值。如果您要使用像列表这样的可变值,这很重要。如果您只需要一本新字典,您将分散并直接将结果z.update()
分配给.dict.fromkeys()
z
假设您需要就地更新,快速比较性能差异:
>>> from timeit import Timer
>>> testdict = {i: i for i in range(10 ** 6)}
>>> def explicit_loop(d):
... d = d.copy()
... for k in d:
... d[k] = ""
...
>>> def dict_fromkeys(d):
... d = d.copy()
... d.update(dict.fromkeys(d, ""))
...
>>> def base_copy(d):
... d = d.copy()
...
>>> count, total = Timer("f(t)", "from __main__ import base_copy as f, testdict as t").autorange()
>>> base_copy_time = total / count
>>> for f in (explicit_loop, dict_fromkeys):
... count, total = Timer("f(t)", f"from __main__ import {f.__name__} as f, testdict as t").autorange()
... print(f"{f.__name__:>15}: {((total / count) - base_copy_time) * 1000:.2f} milliseconds")
...
explicit_loop: 43.15 milliseconds
dict_fromkeys: 68.66 milliseconds
请注意,为了便于准确测试,每次都需要复制输入字典,这就是为什么有一个base_copy
测试来调整时序的原因。
您可以看到显式循环z
显然是赢家。但是即使您不需要就地更新字典,使用dict.fromkeys()
也比z
就地更新要慢!
就地更新不必动态调整字典大小以适应任意数量的键,也不需要创建新对象:
>>> def dict_fromkeys_no_update(d):
... d = d.copy() # to keep comparisons fair, copy only needed for the loop case
... d = dict.fromkeys(d, "")
...
>>> for f in (explicit_loop, dict_fromkeys_no_update):
... count, total = Timer("f(t)", f"from __main__ import {f.__name__} as f, testdict as t").autorange()
... print(f"{f.__name__:>25}: {((total / count) - base_copy_time) * 1000:.2f} milliseconds")
...
explicit_loop: 41.27 milliseconds
dict_fromkeys_no_update: 54.78 milliseconds
因此,无论您是否需要新字典或就地更新,只需对现有字典键进行简单的 Python 循环就是无可争议的赢家。
推荐阅读
- angular - Angular:“位置”类型上不存在属性“go”
- c++ - 如何处理 MFC 中编辑框的“鼠标左键单击”事件
- python - 字段声明 - 导入/导出 CSV
- amazon-web-services - 前端未从 AWS 上的私有 IP 连接到后端
- javascript - HTML 表格行链接在新选项卡中打开
- eclipse - Eclipse + GDB:找不到当前函数的边界
- c# - Wcf 服务失去对客户端证书的访问权限
- operating-system - 从 Windows 10 家庭版升级到 Windows 10 专业版时出现错误代码 0x0
- keytool - 如何从私钥文本文件中提取证书
- android - 我无法通过按钮点击进入另一个活动