【问题标题】:Apply a function to all keys of a Python dict将函数应用于 Python dict 的所有键
【发布时间】:2016-10-27 12:52:47
【问题描述】:

我想转换 Python 字典的所有键。

例如,如果键是整数,我想将每个键更改为原始值乘以 100。

实现这一目标的最高效的方法是什么?

我现在的做法是将原始密钥存储在 set 中并删除这些密钥,用新密钥替换它们 - 如果我有一个 key=2 和一个 key=200在原始密钥集中,会有冲突,我必须递归处理,直到找到与原始密钥集没有冲突的密钥。

【问题讨论】:

    标签: python python-2.7


    【解决方案1】:

    您可以使用字典推导:

    >>> d = {1: 'a', 2: 'b', 3: 'c'}
    >>> {k*100: v for k, v in d.items()}
    {200: 'b', 300: 'c', 100: 'a'}
    

    如果您使用的是 Python 2,请将 items() 替换为 iteritems()

    【讨论】:

      【解决方案2】:

      我会为此使用dict comprehession

      result = {your_func(key): value for key, value in your_dict.iteritems()}
      

      【讨论】:

      • 在 Python 3 中,你可以使用 your_dict.items()
      【解决方案3】:

      要添加在 Python 2.7 和 Python 3.x 中同样有效的 dict 理解答案:

      { your_func(key): your_dict[key] for key in your_dict }
      

      它甚至比 items/iteritems 快一点(至少在我的琐碎测试中;确定你的代码)。

      # Python 2
      >>> timeit.timeit( '{2*x: y for x,y in d.iteritems()}', 'd={1:2, 2:4}')
      0.4100990295410156
      >>> timeit.timeit( '{2*x: d[x] for x in d}', 'd={1:2, 2:4}')
      0.38503098487854004
      
      # Python 3
      >>> timeit.timeit( '{2*x: y for x,y in d.items()}', 'd={1:2, 2:4}')
      0.5370963809546083
      >>> timeit.timeit( '{2*x: d[x] for x in d}', 'd={1:2, 2:4}')
      0.4837625279906206
      

      【讨论】:

      • 如果兼容性是一个问题,这是一个很好的选择:不过,性能提升是微不足道的,所以本着“显式>隐式”的精神,如果我只需要支持一个版本,我会选择(iter)items()
      • 这是因为两个原因。 1 - 你的测试字典太小,2 - 你的测试字典键是整数,尝试生成一个长字典并再次测量它
      • @Alex 你能支持一下吗?我实际上很感兴趣——尽管 先验 items() 也更快
      • @brianpck 1 - 小字典上没有散列冲突,2 - 因为 int 的计算散列比 str 更快(这是我不是 100% 确定的,但应该是这样的这个)。可能还有更多原因,但我对 python 源代码的了解并不深。
      • 我怀疑加快速度完全是因为避免额外调用items();在这两种情况下,您都在遍历一个迭代器,因此随着 dict 的大小增加,比率应该接近 1。我说它更快的评论有点半开玩笑。
      猜你喜欢
      • 1970-01-01
      • 2022-08-04
      • 1970-01-01
      • 2017-04-20
      • 2019-08-28
      • 1970-01-01
      • 1970-01-01
      • 2018-10-21
      • 1970-01-01
      相关资源
      最近更新 更多