【问题标题】:Replacing values of a dictionary in python在python中替换字典的值
【发布时间】:2020-01-23 23:57:23
【问题描述】:

我有一本像这样的字典:

d1 = {('a', 'b'): 300.0,
 ('b, 'c'): '0.1*K1',
 ('a', 'c'): 0.462,
 ('c', 'e'): '0.2*K2',
 ('b', 'a'): '0.1*K1',
 ('c','d'): 'K1*K3'}
K1, K2, K3 = 2.1, 3.4, 2

我想将 d1 中的 '0.1*K1' 替换为 0.1*K1,将 d2 中的 '0.2*K2' 替换为 0.2*K2,以此类推。 d1 中需要替换的值在d2 中作为key 给出,并替换为d2 中对应的值:

d2 = {'0.1*K1':0.1*K1, '0.1*K2':'0.1*K2', 'K2*K3':K2*K3}

最终结果将是一本字典:

d1_new = {('a', 'b'): 300.0,
     ('b, 'c'): 0.21,
     ('a', 'c'): 0.462,
     ('c', 'e'): 0.68,
     ('b', 'a'): 0.21',
     ('c','d'): 6.8}

【问题讨论】:

  • 向我们展示您的尝试,然后我们可以提供帮助
  • 我尝试将其转换为在标记为“Rate”的列中键为 d1 的数据帧,然后使用 df['Rate'].replace(d2)。但是当我有一个大数据框并且需要进行多次计算时,这似乎需要很多时间。
  • 如果你在做表达式评估,考虑sympy

标签: python dictionary key-value


【解决方案1】:

get使用字典理解:

d1_new = {k: d2.get(v, v) for k, v in d.items()}

输出:

{('a', 'b'): 300.0, ('b', 'c'): 0.21000000000000002, ('a', 'c'): 0.462, ('c', 'e'): 0.68, ('b', 'a'): 0.21000000000000002, ('c', 'd'): 4.2}

【讨论】:

    【解决方案2】:

    您可以使用eval 来评估表达式:

    d2 = {key: eval(str(value)) for key, value in d1.items()}
    

    这会导致:

    {
        ('a', 'b'): 300.0,
        ('b', 'c'): 0.21000000000000002,
        ('a', 'c'): 0.462,
        ('c', 'e'): 0.68,
        ('b', 'a'): 0.21000000000000002,
        ('c', 'd'): 4.2
    }
    

    【讨论】:

    • eval 不是最省钱的
    • 就像其他任何东西一样,eval 与您一样安全。
    【解决方案3】:

    您可以使用字典理解:

    d1_new = { k : d2[v] if v in d2 else v for (k, v) in d1.items() }
    

    假设您将d2 更改为:

    d2 = {'0.1*K1':0.1*K1, '0.2*K2':0.2*K2, 'K1*K3':K1*K3}
    

    这样他们输入的d2d1 中的内容匹配,那么输出就是你想要的:

    {
        ('a', 'b'): 300.0,
        ('b', 'c'): 0.21000000000000002,
        ('a', 'c'): 0.462,
        ('c', 'e'): 0.68,
        ('b', 'a'): 0.21000000000000002,
        ('c', 'd'): 4.2
    }
    

    【讨论】: