【问题标题】:How to find the largest value in a dictionary by comparing values?如何通过比较值找到字典中的最大值?
【发布时间】:2013-12-25 13:29:05
【问题描述】:

有一种方法可以根据字典(在 Python 中)找到表示最高值的键 this 问题。不过,我想做点不同的事情。

假设我们有一本字典 D,比如说:

   D = {'a' : 1 , 'q' : 2,  'b' : 3, 'c': 2}

我想通过遍历键的值来找到字典的最大值,每次比较两个键的值,然后“记住”表示局部变量中最大值的键。最后,我应该在 D 中找到键及其最大值。在这种情况下,我们应该有这样的东西:

compare('a', 'q') --> remember q
compare('q', 'b') --> remember b
compare('b', 'c') --> remember b

现在最大键是 'b',值为 3。

但是如何比较 for 循环中键的值呢?我该怎么做:

for k,v in D.iteritems() : 
    if (dictitem) > (dictitem + 1) : 
        remember = dictitem 
    else : 
        remember = dictitem + 1 

但现在有什么真正有效的方法?

【问题讨论】:

  • 看到这个post和这个post
  • @KobiK 是的,我已经阅读了这些帖子,但我想以不同的方式来做。我想遍历字典,每次比较每两个相邻的元素。
  • 您使用的是无序字典。从理论上讲,排序可以任意更改。

标签: python python-2.7 max


【解决方案1】:
>>> D = {'a' : 1 , 'q' : 2,  'b' : 3, 'c': 2}
>>> max(D, key=D.get)
'b'

【讨论】:

  • 谢谢,但我想换一种方式。我想遍历字典,每次比较每两个相邻的元素。
【解决方案2】:

@henices 的回答很棒,您应该使用它。但是给你一个关于如何实现 max 函数的一般说明:

D = {'a' : 1 , 'q' : 2,  'b' : 3, 'c': 2}
my_max_val = 0
for k,v in D.items():
    if v > my_max_val:
        my_max_val=v
        my_max_key=k


>>> my_max_val
3
>>> my_max_key
'b'

【讨论】:

  • 如果有两个相同的值怎么办:O @zenpoy
  • @School - 比较值时,它将返回正确答案,即最大值。问题是它会找到哪个键。它将按照字典的排序顺序找到第一个键
  • 那么是否可以打印相同的最高值和不同的键? @zenpoy
  • @School - 是的 - 您可以保存 my_max_valmy_max_keysset 并为 v == my_max_val 添加一个案例,而不是保存 my_max_val
【解决方案3】:

看起来你想在for循环中找到最大数字而不是使用像max这样的内置函数,我编写代码如下,希望对你有用。

  D= {'a' : 1 , 'q' : 2,  'b' : 3, 'c': 2}
  for index, k in enumerate(D.iterkeys()):
      if  not index:
         remember = k 
     else:
         if D[k] > D[remember]:
            remember = k 
  print remember

【讨论】:

    【解决方案4】:

    zenpoy 的方法从一个可能不是有效结果的值开始。如果问题是找到具有 minimum 值的键,则该方法将失败。你想要的(除了使用 max(D, key=D.get) 方法)是

    D = {'a' : 1 , 'q' : 2,  'b' : 3, 'c': 2}
    my_max_val = None
    for k,v in D.items():
        if my_max_val is None:
            my_max_val=v
            my_max_key=k
        elif v > my_max_val:
            my_max_val=v
            my_max_key=k
    

    【讨论】:

      【解决方案5】:

      由于您想在 for 循环中执行此操作,您可以尝试 zenpoy 的方法。但请确保像 MattNewville 所做的那样对 my_max_val 使用更好的初始化。

      这是类似于您在问题中提供的结构的方法。 `

      D = {'a' : 1 , 'q' : 2,  'b' : 3, 'c': 2}
      li = D.keys()
      j = len(li)
      for i in range(0,j-1):
          if D[li[i]]>D[li[i+1]]:
              maxi = D[li[i]]
          else:
              maxi = D[li[i+1]]
      

      【讨论】:

        【解决方案6】:

        我认为这可能是另一种方法。您可以使用 operator.itemgetter:

        import operator
        mydict = {'a' : 1 , 'q' : 2,  'b' : 3, 'c': 2}
        max(mydict.iteritems(), key=operator.itemgetter(1))[0]
        

        而不是在内存中构建一个新列表,而是使用 stats.iteritems()。 max() 函数的 key 参数是一个计算用于确定如何对项目进行排名的键的函数。这适用于有两个 max instread 的情况。就像在

        的情况下
        mydict = { 'a' : 1 , 'q' : 2,  'b' : 3, 'c': 2 , 'd' : 7 , 'e' : 8 , 'd' : '4' }
        

        这种情况下的输出将是“d”。因为 d 的值之一是最大值。

        【讨论】:

          猜你喜欢
          • 2023-02-05
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-12-03
          • 2018-05-23
          • 2022-08-14
          • 1970-01-01
          相关资源
          最近更新 更多