2012-03-29 16 views
8

Załóżmy, że mam następujący słownika i listy:Czy jest możliwe pobranie uporządkowanego "wycinka" ze słownika w Pythonie na podstawie listy kluczy?

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

istnieje bezpośredni (pythonowy) sposób uzyskać par klucz-wartość ze słownika do którego klucze są elementy znajdujące się na liście, w kolejności zdefiniowane przez porządek listy?

Podejście naiwne polega po prostu na iteracji na liście i wyświetlaniu wartości na mapie jeden po drugim, ale zastanawiam się, czy python ma odpowiednik wycinania list dla słowników.

+0

Ponieważ pytanie jest o wykorzystanie funkcji językowych, ja tylko naprawdę starał Google. =) – merlin2011

Odpowiedz

9

Nie wiem, czy wystarczająco pythonic ale to działa:

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

To list comprehension, ale jeśli trzeba iteracyjne tej listy tylko raz, można również przekształcić go w wyrażeniu generatora, na przykład :

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

Oczywiście poprzednie metody działają tylko wtedy, gdy wszystkie elementy na liście znajdują się w słowniku; w celu uwzględnienia key-nie-niniejszym przypadku można to zrobić:

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

Prosta droga naprzód byłoby wybrać każdą pozycję ze słownika i sprawdzić, czy klucz jest obecny na liście

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

Powyższa wyszukiwarka będzie liniowy, więc może zdobyć wydajność poprzez przekształcenie listę ustawić

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

i wreszcie jeśli potrzebujesz słownika zamiast listy klucz, Para wartość krotki ty może używać słownika do zrozumienia

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

To, czy jest to dobry pomysł, zależy od wielkości listy. Jeśli lista jest bardzo mała, jest to raczej marnotrawstwo. –

+0

Czy Twój drugi i trzeci przykład nie powtórzy zestawu (my_list) za każdym razem? – DSM

3

Co powiesz na to? Pobierz każdy element w postaci my_list i przekaż go do metody słownikowej get. Obsługuje także wyjątki dotyczące brakujących kluczy, zastępując je None.

map(my_dictionary.get, my_list) 

Jeśli chcesz tupples zip to -

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

Jeśli chcesz nowy dict, przekaż tupple do 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')] 
Powiązane problemy