2012-03-29 16 views
8

Giả sử tôi có các từ điển sau đây và danh sách:Có thể lấy một "lát cắt" theo thứ tự của một từ điển trong Python dựa trên một danh sách các khóa không?

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

Có (Pythonic) cách trực tiếp để có được cặp khóa-giá trị ra khỏi từ điển mà các phím là những yếu tố trong danh sách, trong một trật tự được xác định theo thứ tự danh sách?

Cách tiếp cận ngây thơ đơn giản là lặp qua danh sách và rút ra các giá trị trong bản đồ từng cái một, nhưng tôi tự hỏi nếu python có tương đương với danh sách cắt cho từ điển.

+0

Kể từ khi câu hỏi là về việc sử dụng một tính năng ngôn ngữ, tôi chỉ thực sự cố gắng của Google. =) – merlin2011

Trả lời

9

Không biết nếu đủ pythonic nhưng điều này đang làm việc:

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

Đây là một list comprehension, nhưng, nếu bạn cần phải lặp danh sách đó một lần duy nhất, bạn cũng có thể biến nó thành một biểu thức máy phát điện, ví dụ :

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

Tất nhiên các phương pháp trước chỉ hoạt động nếu tất cả các phần tử trong danh sách có trong từ điển; để giải thích cho trường hợp key-không-hiện tại bạn có thể làm điều này:

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

Một cách thẳng về phía trước sẽ được chọn mỗi mục từ điển và kiểm tra xem phím có mặt trong danh sách

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

việc tìm kiếm ở trên sẽ là tuyến tính, do đó bạn có thể đạt được một số hiệu suất bằng cách chuyển đổi danh sách để thiết lập

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

Và cuối cùng, nếu bạn cần một cuốn từ điển thay vì một danh sách các chìa khóa, cặp giá trị tuples bạn có thể sử dụng từ điển hiểu

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

Có hay không ý tưởng này phụ thuộc vào kích thước của danh sách. Nếu danh sách là rất nhỏ, điều này là khá lãng phí. –

+0

Chẳng phải ví dụ thứ hai và thứ ba của bạn sẽ tính toán lại (my_list) mỗi lần? – DSM

3

Làm thế nào về điều này? Lấy tất cả các mục trong my_list và chuyển nó vào phương thức get của từ điển. Nó cũng xử lý các ngoại lệ xung quanh các phím bị mất bằng cách thay thế chúng bằng None.

map(my_dictionary.get, my_list) 

Nếu bạn muốn tupples zip nó -

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

Nếu bạn muốn có một dict mới, vượt qua tupple để 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')] 
Các vấn đề liên quan