2014-02-17 59 views
2

我有一個字典,其中的值是列表。我需要在刪除重複項後找到哪個鍵的值最長。如果我找到最長的列表,這將無法正常工作,因爲可能有很多重複項。我嘗試了幾件事,但沒有什麼是遠程接近正確的。以列表爲值的字典 - 找到最長列表

+1

最好與您的問題分享您的努力。 – squiguy

+0

我會在下次做。我的努力根本不正確,這就是爲什麼我認爲在這裏寫作沒有意義。 – user2795095

+0

我不明白你爲什麼擔心重複。如果它們是相同的,它們具有相同的長度並且不會影響最大值。字典沒有排序,因此找到列表最長的「第一個」鍵可能會很棘手。 – jcfollower

回答

9
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迭代的代碼(這是一本字典遍歷,靠了靠。for x in dict: print x將打印在dict每個鍵),它會返回它找到具有最高的關鍵結果應用key=時我們構建的功能(這就是lambda所做的)。你可以從字面上做任何事,這就是它的美。但是,如果你想要的鍵和值,你也許能夠做這樣的事....

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, 768max仍照常工作,它會迭代我們用d.items()構建的新列表,並將這些值傳遞給它的key函數(lambda k,v: len(set(v)))。您還會注意到我們不需要執行len(set(d[k])),而是直接在v上運行,這是因爲d.items()已創建d[k]值,並且使用lambda k,v正在使用相同的解壓縮語句將密鑰分配給k,並且值爲v

魔法!顯然不起作用的魔法。實際上,我並沒有在這裏深入挖掘,實際上,它們本身並不能解開價值。相反,請執行以下操作:

max_key, max_value = max(d.items(), key = lambda x: len(set(x[1]))) 
+0

非常感謝!並且非常感謝解釋,我認爲我更接近真正理解它的工作原理。但是,我不明白的是爲什麼它只寫了鑰匙,而不是價值?我怎樣才能讓它寫兩個? (我並不真的需要這個,但我想也許這會讓我更好地理解它是如何工作的)。 – user2795095

+1

@ user2795095編輯更多的信息和關鍵,值對:) –

+0

哇,謝謝!我非常感謝,學到了很多:)再一次,謝謝:D – user2795095