【问题标题】:Comparing values of two dicts in Python在 Python 中比较两个字典的值
【发布时间】:2017-09-04 05:47:27
【问题描述】:

我有两本词典:

budgets = {'Engineering': 4500.0,
 'Marketing': 5000.0,
 'Operations': 3000.0,
 'Sales': 2000.0}

spending = {'Engineering': 5020.0,
 'Marketing': 1550.0,
 'Operations': 3670.0,
 'Sales': 3320.0}

我试图遍历它们,找出spending 中的哪些值大于budgets 中的值。我目前写过:

for value in spending.values():
    if value in spending.values() > budgets.values():
        print 'Over Budget'
    else:
        print 'Under Budget'

但是,当我运行它时,它们都打印出Over Budget,显然不是这样。有人可以解释我在处理这个问题时的错误吗?

谢谢:)

【问题讨论】:

    标签: python python-2.7 loops dictionary for-loop


    【解决方案1】:

    value in spending.values() > budgets.values() 部分实际上评估布尔查询 value in spending.values()--成员资格检查--然后将其结果与 budget.values() 进行比较:来自 budget 的值。在 Python 中,所有内容都可以进行比较,因此您可以将布尔值与列表进行比较——每次都相同,在您的情况下计算结果为 True。你想要的更像是这样的:

    for key in spending:
        if spending[key] > budgets[key]:
            print('Over Budget')
        else:
            print('Under Budget')
    

    编辑:这仅适用于 Python 2。在 Python 3 中,您会收到 TypeError: unorderable types,它可以让您避免出现此类错误。

    【讨论】:

    • 我赞成,但你应该提到这是特定于 Python 2 的。在 Python 3 中,大多数类型间比较都会出错。
    • 好点。我假设是 Python 2,因为他使用的是 print 语句,没有括号。
    • 是的。事实上,它被标记为 Python 2.7
    【解决方案2】:

    dict.items()怎么样:

    budgets = {'Engineering': 4500.0,
     'Marketing': 5000.0,
     'Operations': 3000.0,
     'Sales': 2000.0}
    
    spending = {'Engineering': 5020.0,
     'Marketing': 1550.0,
     'Operations': 3670.0,
     'Sales': 3320.0}
    
    for category, spent in spending.items():
        print(category)
        if spent > budgets[category]:
            print('Over Budget')
        else:
            print('Under Budget')
    

    【讨论】:

      【解决方案3】:

      @aryamccarthy 有一个很好的答案,但为了 Python,我将发布另一种您可以采用的方法,只使用一行:

      {(sk, 'Over Budget') if sv > budgets[sk] 
             else (sk, 'Under Budget') for sk, sv in spending.items()}
      

      这种方法返回以下内容,这不一定是显示信息的最漂亮方式,但从这里使用print 获得漂亮的输出并不是很远:

      {('Marketing', 'Under Budget'), ('Sales', 'Over Budget'), ('Engineering', 'Over Budget'), ('Operations', 'Over Budget')}
      

      请注意,如果spending 中的任何键不属于budgets,这将引发KeyError

      【讨论】:

      • 那不是真的一行:P
      【解决方案4】:

      if value in spending.values() > budgets.values(): 应该是value in spending.values():

      for value in spending.values():
         v={k:v for (k,v) in budgets.items() if v > value}
         if v:
            print "Under"
         else:
            print value, "is spending greater than the values in budget"
      

      【讨论】:

      • 这种情况没有做它应该做的事情。您的情况几乎与5000 > [5000.0, 2000.0, 4500.0, 3000.0] 类似。这是不正确的。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多