2012-03-29 85 views
8

假設我有以下的字典和列表:是否可以根據鍵列表在Python中對字典進行排序?

my_dictionary = {1:"hello", 2:"goodbye", 3:"World", "sand":"box"} 
my_list = [1,2,3] 

有直達(Python化)的方式來獲得鍵值對出了其鍵列表中的元素的字典,在順序由列表順序定義?

簡單的方法是簡單地遍歷列表並逐個拉出地圖中的值,但我不知道python是否與字典的列表切片等效。

+0

由於問題是關於語言特徵的使用我才真正嘗試過谷歌。 =) – merlin2011 2012-03-29 20:21:35

回答

9

不知道是否有足夠的Python的,但是這是工作:

res = [(x, my_dictionary[x]) for x in my_list] 

這是一個list comprehension,但是,如果你需要遍歷該列表中只有一次,你也可以把它變成一臺發電機的表情,例如:

for el in ((x, my_dictionary[x]) for x in my_list): 
    print el 

當然,以前的方法只有在列表中的所有元素都存在於字典中時才起作用;考慮到鑰匙不存在的情況下,你可以這樣做:

res = [(x, my_dictionary[x]) for x in my_list if x in my_dictionary] 
1

一個直截了當的方法是從字典中挑選的每一項檢查,關鍵是出現在列表

>>> [e for e in my_dictionary.items() if e[0] in my_list] 
[(1, 'hello'), (2, 'goodbye'), (3, 'World')] 

上面的搜索將是線性的,所以你可能會被轉換列表中設置

>>> [e for e in my_dictionary.items() if e[0] in set(my_list)] 
[(1, 'hello'), (2, 'goodbye'), (3, 'World')] 

最後,如果你需要一本字典,而不是關鍵的名單,值對的元組你獲得一些性能可以用字典理解

>>> dict(e for e in my_dictionary.items() if e[0] in set(my_list)) 
{1: 'hello', 2: 'goodbye', 3: 'World'} 
>>> 
+1

這是否是一個好主意取決於列表的大小。如果名單很小,這是相當浪費的。 – 2012-03-29 20:13:54

+0

您的第二個和第三個示例每次都不會重新計算set(my_list)嗎? – DSM 2012-03-29 20:16:03

3

這個怎麼樣?取my_list中的每一項並將其傳遞給字典的get方法。它還通過將其替換爲None來處理丟失密鑰周圍的異常。

map(my_dictionary.get, my_list) 

如果你想tupples zip它 -

zip(my_list, map(my_dictionary.get, my_list)) 

如果你想有一個新的字典,通過元組與dict。

dict(zip(my_list, map(my_dictionary.get, my_list))) 
5
>>> zip(my_list, operator.itemgetter(*my_list)(my_dictionary)) 
[(1, 'hello'), (2, 'goodbye'), (3, 'World')] 
相關問題