2013-07-11 9 views
5

Potrzebuję wyodrębnić te klucze ze słownika, których wartości przechodzą pewien warunek. Zasadniczo, chcę to zrobić, tylko w krótszym, bardziej pythony sposób:Python3: warunkowa ekstrakcja kluczy ze słownika ze zrozumieniem

keys=[] 
for key in dict: 
    if dict[key]==True: 
     keys.append(key) 

To był mój oryginalny pomysł, ale to podnosi ValueError:

[key for (key,val) in map if val==True] 

wymyśliłem to dla Chwila, ale nie mogę oprzeć się wrażeniu, że to niezbyt miłe:

[key for key in map.keys() if map[key]==True] 

Czy jest mniej niechlujny sposób? Może coś oczywistego, czego wyraźnie brakuje?

Dzięki!

Odpowiedz

0

Iterowanie nad mapowaniem daje tylko klucze. Zamiast tego użyj map.items().

+1

Pytanie oznaczonego (w tytule) Pythonie 3, więc 'dict.iteritems()' nie istnieje. – Volatility

+0

@Volatility: To nauczy mnie tylko patrzenia na znaczniki ... –

2

Zastosowanie dict.items()

[key for key, val in dct.items() if val] 

Jeśli chcesz podjąć tylko klucze z True wartości, raczej niż wartość true-owski, można użyć sprawdzenie równości:

[key for key, val in dct.items() if val==True] 

należy zauważyć, w PEP8 nie należy jednak porównywać wartości logicznych za pomocą == - więc nie używaj go, chyba że absolutnie potrzebujesz.

Proszę również nie nadawać zmiennych dict lub map (nawet jeśli jest to tylko do celów demonstracyjnych), ponieważ śledzą one bulitiny.

3

Oto sposób, aby dostać klucze z prawdziwymi wartościami, które jest o wiele krótsza i czystsze niż zrozumieniem (nie że Ułatwienia są złe choć):

>>> dct = {0:False, 1:True, 2:False, 3:True} 
>>> list(filter(dct.get, dct)) 
[1, 3] 
>>> 
+0

Nie potrzebujesz 'dct.keys()' - iteracja po słowie daje klucze już. Użyj 'dct' – Volatility

Powiązane problemy