2017-02-26 23 views
1
dictionary = {"key1": ["Item1", "Item2"], "key2": ["Item3", "Item4"]} 

使用上面的字典,试图遍历它并返回大多数值的密钥。用大多数值确定密钥

我是想这样的:

def most_values(a): 
    return max(a, key=a.get) 

虽然它会返回它先检查任何关键这是不坏。接下来我尝试了:

def most_values(a): 
    count = 0 
    high = "" 
    for t in a: 
     if len(a[t]) > count: 
      count += 1 
      high = t 
    return high 

但它也是这样做的,并且会返回它首先迭代的任何密钥。这也不是一个非常优雅的解决方案。

什么是最多pythonic这种方式呢?

回答

4

的问题:

return max(a, key=a.get) 

是,这里的key不长返回实际列表和Python中名单字典顺序比较,所以(有事情要说两种方式来比较列表,但他们决定按字典顺序排序)。但是,您可以轻松地修改此:

def most_values(a): 
    return max(a, key=lambda x:len(a[x]))

这可能是最Python化方式,因为它是声明(你没有想到最大的是如何计算),优雅可读并有无副作用


与你的第二个方法的问题是,你应该设置countlen(a[t]),不增加它。所以,你可以解决它想:

def most_values(a): 
    count = -1 
    high = None 
    for key,val in a.items(): 
     if len(val) > count: 
      count= len(val) # semantical error in your code 
      high = key 
    return high
+1

_you应该设置算到新LEN (a [t])_ 这真的帮助我了解我做错了什么。非常感谢你对我的代码的反馈! – Melanie

2

这个怎么样:

sorted(dictionary.iteritems(), key=lambda x:len(x[1]), reverse=True)[0][0] 

排序()耍酷。 dictionary.iteritems()是字典中key:value对的迭代器。键将收到这样一对,并使用其中的第二项(价值)作为其比较的东西。 reverse = True会使它从大到小排序。第[0]会返回“最大”的键值对和第二[0]会返回键

或与威廉·Onsem的想法走,因为它更清洁

+0

如果您只需要最大限度的项目,则可以使用总量过多的项目对项目进行排序。如果你需要很多结果,这样才更好。 – Wombatz

+0

@Wombatz当然,你是正确的,但它早上3点,它首先想到的是 – Nullman

+0

我接受了Willem的回答,因为他非常详尽地指出了我逻辑中的错误并解释了一些细节python解释我写的东西。你的回答也有很大的帮助,因为你解释了代码的每个部分都在做什么,这有助于我全面理解。谢谢Nullman! – Melanie