2013-07-11 10 views
5

Ich muss diese Schlüssel eines Wörterbuchs extrahieren, deren Werte eine bestimmte Bedingung bestehen. Im Grunde möchte ich, dies zu tun, nur in einer kürzeren, pythony Weise:Python3: Bedingte Extraktion von Schlüsseln aus einem Wörterbuch mit Verständnis

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

Das ist meine ursprüngliche Idee war, aber es wirft ein Valueerror:

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

Ich kam auf diese für

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

gibt es einen weniger chaotisch Weg zu ihnen: der Moment, aber ich kann es nicht sehr schön das Gefühl nicht los? Vielleicht etwas offensichtlich, dass ich eindeutig vermisse?

Danke!

Antwort

0

Iterieren über ein Mapping ergibt nur Schlüssel. Verwenden Sie stattdessen map.items().

+1

Die Frage (im Titel) Python markiert ist 3, also 'dict.iteritems()' existiert nicht. – Volatility

+0

@ Volatility: Das wird mich lernen, nur um die Tags zu sehen ... –

2

Verwenden dict.items()

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

Wenn Sie nur die Tasten mit True Werte nehmen wollen, anstatt jeden wahren ish Wert, erhalten Sie eine Gleichheitsprüfung verwenden:

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

Es sei bemerkt, in PEP8 obwohl, dass man keine booleschen Werte mit == vergleichen sollte - also verwenden Sie es nicht, es sei denn, Sie müssen unbedingt.

Benennen Sie auch keine Variablen dict oder map (auch wenn es nur zu Demonstrationszwecken dient), da sie die Bulitine überschatten.

3

Hier ist eine Möglichkeit, die Schlüssel mit wahren Werten zu erhalten, die viel kürzer und sauberer als ein Verständnis ist (nicht, dass Comprehensions obwohl schlecht ist):

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

Sie brauchen nicht 'dct.keys()' - Iterieren über ein Wörterbuch ergibt die Schlüssel bereits. Verwende 'dct' – Volatility

Verwandte Themen