【问题标题】:Add a key to the dict if not exist, then rename this key如果不存在,则向字典添加一个键,然后重命名此键
【发布时间】:2016-02-25 05:05:20
【问题描述】:

假设我有一个字典列表:

ls = [{'id': 1, 'a1': 2, 'a2': 3}, {'id':2, 'a2':4}, {'id':3, 'a2':5}]

a1 在某些字典中不存在

我想在缺少a1 的这些字典中将a1 设置为0,并将所有字典中的键名a1 更改为b1。这是我想出的代码

for l in ls:
    l.setdefault('a1', 0)
    l['b1'] = l.pop('a1')

我想知道是否可以提高效率,因为我需要运行这段代码数百万次。任何改进将不胜感激。

【问题讨论】:

  • 为什么不直接使用代码:l.setdefault('b1', l.pop('a1') if 'a1' in l else 0)
  • 在我的旧笔记本上,在包含一百万个字典的列表上运行您的代码只需要半秒钟。如果您的代码执行除此之外的任何其他操作,那么它似乎不太可能成为瓶颈。寻找更优雅的代码可能很有趣,但我不会担心这种规模的效率。
  • @DSM,我将在只有 1cpu 和 0.5G RAM 的 VPS 上运行它。每个列表将有数百个到 10k 的字典,我有数千万个这样的列表要运行。假设我有 1000 万个列表,不知何故我可以节省 0.01 秒,这将为我节省 27.78 小时。因此,任何改进都可能意义重大。
  • @Harrison:根据timeit 模块的结果,我的答案中的解决方案应该提供大约 20% 的改进。

标签: python dictionary


【解决方案1】:

这里有一个小改进,它利用了dict.pop() 可以在键不在字典中时将参数作为默认值返回:

ls = [{'id': 1, 'a1': 2, 'a2': 3}, {'id':2, 'a2':4}, {'id':3, 'a2':5}]
for d in ls:
    d['b1'] = d.pop('a1', 0)

>>> ls
[{'a2': 3, 'id': 1, 'b1': 2}, {'a2': 4, 'id': 2, 'b1': 0}, {'a2': 5, 'id': 3, 'b1': 0}]

【讨论】:

    猜你喜欢
    • 2023-03-16
    • 1970-01-01
    • 2015-12-03
    • 1970-01-01
    • 1970-01-01
    • 2022-07-25
    • 2013-05-04
    • 1970-01-01
    • 2013-03-02
    相关资源
    最近更新 更多