列表作为值列表 - 找到最长列表

时间:2014-02-17 21:03:12

标签: python list dictionary set

我有一个字典,其中的值是列表。删除重复项后,我需要找到哪个键具有最长列表作为值。如果我找到最长的列表,这将无法工作,因为可能有很多重复。我尝试了几件事,但没有什么是正确的。

2 个答案:

答案 0 :(得分:13)

d = # your dictionary of lists

max_key = max(d, key= lambda x: len(set(d[x])))
# here's the short version. I'll explain....

max( # the function that grabs the biggest value
    d, # this is the dictionary, it iterates through and grabs each key...
    key = # this overrides the default behavior of max
        lambda x: # defines a lambda to handle new behavior for max
            len( # the length of...
                set( # the set containing (sets have no duplicates)
                    d[x] # the list defined by key `x`
                   )
               )
   )

由于max的代码遍历字典的键(这是字典遍历的,通过by。for x in dict: print x将打印dict中的每个键)它将返回当它应用我们构建的函数(lambdakey=所做的)时,它发现具有最高结果的键。你可以在这里做任何事情,这就是它的美丽。但是,如果你想要键和值,你可能会做这样的事情......

d = # your dictionary

max_key, max_value = max(d.items(), key = lambda k,v: len(set(v)))
# THIS DOESN'T WORK, SEE MY NOTE AT BOTTOM

这有所不同,因为我们不是传递d这是一个字典,而是传递d.items(),它是根据d的键和值构建的元组列表。例如:

d = {"foo":"bar", "spam":['green','eggs','and','ham']}
print(d.items())
# [ ("foo", "bar"),
#   ("spam", ["green","eggs","and","ham"])]

我们不再看字典,但所有数据仍然存在!它使我使用的解压缩语句更容易处理:max_key, max_value =。这与您WIDTH, HEIGHT = 1024, 768的工作方式相同。 max仍然照常工作,它会遍历我们使用d.items()构建的新列表,并将这些值传递给其key函数(lambda k,v: len(set(v)))。您还会注意到我们不必执行len(set(d[k])),而是直接在v上运行,因为d.items()已经创建了d[k]值,并使用{ {1}}使用相同的解包语句将密钥分配给lambda k,v,将值分配给k

魔术!显然,魔术不起作用。我在这里没有深入挖掘,v s实际上不能自己解包值。相反,做:

lambda

答案 1 :(得分:0)

对于不太高级的用户,这可以是一个解决方案:

longest = max(len(item) for item in your_dict.values())
result = [item for item in your_dict.values() if len(item) == longest]