假设我有以下的字典和列表:是否可以根据键列表在Python中对字典进行排序?
my_dictionary = {1:"hello", 2:"goodbye", 3:"World", "sand":"box"}
my_list = [1,2,3]
有直达(Python化)的方式来获得键值对出了其键列表中的元素的字典,在顺序由列表顺序定义?
简单的方法是简单地遍历列表并逐个拉出地图中的值,但我不知道python是否与字典的列表切片等效。
假设我有以下的字典和列表:是否可以根据键列表在Python中对字典进行排序?
my_dictionary = {1:"hello", 2:"goodbye", 3:"World", "sand":"box"}
my_list = [1,2,3]
有直达(Python化)的方式来获得键值对出了其键列表中的元素的字典,在顺序由列表顺序定义?
简单的方法是简单地遍历列表并逐个拉出地图中的值,但我不知道python是否与字典的列表切片等效。
不知道是否有足够的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]
一个直截了当的方法是从字典中挑选的每一项检查,关键是出现在列表
>>> [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'}
>>>
这是否是一个好主意取决于列表的大小。如果名单很小,这是相当浪费的。 – 2012-03-29 20:13:54
您的第二个和第三个示例每次都不会重新计算set(my_list)吗? – DSM 2012-03-29 20:16:03
这个怎么样?取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)))
>>> zip(my_list, operator.itemgetter(*my_list)(my_dictionary))
[(1, 'hello'), (2, 'goodbye'), (3, 'World')]
由于问题是关于语言特征的使用我才真正尝试过谷歌。 =) – merlin2011 2012-03-29 20:21:35