簡體   English   中英

是否可以根據鍵列表在Python中獲取字典的有序“切片”?

[英]Is it possible to take an ordered “slice” of a dictionary in Python based on a list of keys?

假設我有以下字典和列表:

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

是否有直接(Pythonic)方法從列表順序定義的順序中獲取鍵是列表中元素的字典中的鍵值對?

天真的方法只是迭代列表並逐個拉出地圖中的值,但我想知道python是否具有相似的字典列表切片。

不知道pythonic是否足夠但這是有效的:

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

這是一個列表理解 ,但是,如果您只需要迭代該列表一次,您還可以將其轉換為生成器表達式,例如:

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]
>>> zip(my_list, operator.itemgetter(*my_list)(my_dictionary))
[(1, 'hello'), (2, 'goodbye'), (3, 'World')]

這個怎么樣? 獲取my_list每個項目並將其傳遞給字典的get方法。 它還通過將其替換為None處理丟失密鑰的異常。

map(my_dictionary.get, my_list)

如果你想要tupples zip -

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

如果你想要一個新的字典,請將tupple傳遞給dict。

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

一種直接的方法是從字典中選擇每個項目並檢查列表中是否存在該鍵

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

上面的搜索將是線性的,因此您可以通過將列表轉換為set來獲得一些性能

>>> [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'}
>>> 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM