2012-03-29 79 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')] 
相关问题