【问题标题】:Multiplying the values of dictionaries with different keys将字典的值与不同的键相乘
【发布时间】:2018-03-14 23:34:54
【问题描述】:

两个字典的值与相同键相乘的问题,我决定如下:

v1={'name1': '10', 'name2': '20'}
v2={'name1': '4', 'name2': '5'}

foo = lambda dct_1, dct_2: {key: int(dct_2[key]) * int(dct_1[key]) for key in dct_2}

foo(v1, v2)
# Out: {'name1': 40, 'name2': 100}

如何以相同的方式将两个字典的值相乘,但使用不同的键?

v1={'name1': '10', 'name2': '20'}
v2={'quantity1': '4', 'quantity2': '5'}

#OUT: {'name1':'40', 'name2': '100'}

【问题讨论】:

  • 每个dict的键名是否包含相同的数字?
  • 要非常小心。字典没有顺序,所以你怎么知道哪些元素要相乘。考虑改用 collections.OrderedDict。
  • 嗨!我只是想出了一个例子。在这个例子中,是的。但总的来说,在这个例子中,我想强调不同的键名。感谢您的评论

标签: python python-3.x dictionary dictionary-comprehension


【解决方案1】:

假设您总是有相应的 nameXquantityX 值,您可以在键上使用简单的替换:

foo = lambda dct_1, dct_2: {key: int(dct_2[key.replace('name', 'quantity')]) * int(dct_1[key]) for key in dct_1}

【讨论】:

    【解决方案2】:
    multiplydicts = lambda x,y: { key: str(int(v1[key]) * int(val)) for key,val in zip(v1.keys(), v2.values())}
    

    假设您的字典大小相同,这应该可以解决问题,并且 v2.values() 将按构造顺序返回 v2 的值。

    【讨论】:

      【解决方案3】:

      你可以这样做:

      >>> v1={'name1': '10', 'name2': '20'}
      >>> v2={'quantity1': '4', 'quantity2': '5'}   
      >>> d={'name'+str(i+1) : int(v1['name'+str(i+1)])*int(v2['quantity'+str(i+1)]) for i in range(len(v1))}
      >>> d
      {'name2': 100, 'name1': 40}
      

      【讨论】:

        【解决方案4】:

        您只需要添加一些东西来将第一个字典中的键映射到第二个字典中的键。最简单的方法是在下面的代码中使用名为keymap 的第三个字典。第一个字典中的键确定将出现在返回的字典中的键。

        这是必需的,因为普通字典中键的顺序是未定义的,因此您无法依赖或预测在迭代它们时它们会出现的顺序。

        v1={'name1': '10', 'name2': '20'}
        v2={'quantity1': '4', 'quantity2': '5'}
        keymap = {'name1': 'quantity1', 'name2': 'quantity2'}  # Added.
        
        foo = (lambda dct_1, dct_2:
                {key: int(dct_2[keymap[key]]) * int(dct_1[key]) for key in dct_1})
        
        print(foo(v1, v2))  # -> {'name1': 40, 'name2': 100}
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2017-03-27
          • 1970-01-01
          • 2013-02-26
          • 2018-04-01
          • 2019-07-09
          • 1970-01-01
          • 1970-01-01
          • 2021-08-04
          相关资源
          最近更新 更多