【问题标题】:Perform operation on some (not all) dictionary values对一些(不是全部)字典值执行操作
【发布时间】:2018-03-05 22:40:48
【问题描述】:

我有一个名为 spectradict 的字典,它由 5 个不同的键(每个键有多个值)组成,我想将 4 个键下的每个值乘以某个常数 A。我已经弄清楚如何将所有值(在所有键下)乘以常数:

spectradict.update((x, y*A) for x, y in spectradict.items())

但我只希望spectradict['0.001']spectradict['0.004']spectradict['0.01']spectradict['0.02'] 下的值乘以 A。我希望 spectradict['E'] 的值保持不变。我怎样才能做到这一点?

【问题讨论】:

    标签: python dictionary key-value


    【解决方案1】:

    您可以通过将if <test> 附加到它的末尾来对您的生成器函数执行条件检查。

    spectradict.update((k, v*A) for k, v in spectradict.items() if k != 'E')
    # or, inclusive test using a set
    spectradict.update((k, v*A) for k, v in spectradict.items() if k in {'0.001', '0.004', '0.01', '0.02'})
    

    【讨论】:

    • 谢谢,这有帮助。但是,由于我的字典非常大(每个键都有数千个值),因此需要一段时间才能运行——您知道完成相同任务的更快方法吗?
    • v 很大,还是有很多键?如果是前者,那么您处理更新字典的方法可能影响不大。我建议专门针对您正在执行的任何操作的效率创建一个新问题。如果是因为有很多键,我刚刚做的一个玩具基准测试表明,使用 {generator expression} 从头开始​​创建更新的字典会更有效。
    【解决方案2】:

    您可以明确列出键:

    #UNTESTED
    spectradict.update((x, spectradict[x]*A) for x in ['0.001', '0.004', '0.01', '0.02'])
    

    或者,您可以排除E

    #UNTESTED
    spectradict.update((x, y*A) for x, y in spectradict.items() if x != 'E')
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-01-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多