2016-08-30 5 views
3

Ich bin auf der Suche nach einer Möglichkeit, bestimmte Schlüssel aus einem Wörterbuch zu bekommen.Möglichkeit, bestimmte Schlüssel aus dem Wörterbuch zu bekommen

Im Beispiel unten, ich versuche zu get all keys except 'inside'

>>> d 
{'shape': 'unchanged', 'fill': 'unchanged', 'angle': 'unchanged', 'inside': 'a->e', 'size': 'unchanged'} 
>>> d_keys = list(set(d.keys()) - set(["inside"])) 
>>> d_keys 
['shape', 'fill', 'angle', 'size'] 
>>> for key in d_keys: 
...  print "key: %s, value: %s" % (key, d[key]) 
... 
key: shape, value: unchanged 
key: fill, value: unchanged 
key: angle, value: unchanged 
key: size, value: unchanged 

Gibt es einen besseren Weg, dies als oben zu tun?

+0

Warum tun Sie 'set (d.keys())'? Schlüssel sollten bereits eindeutig sein – depperm

+0

, weil Sie Set Operationen sonst nicht verwenden können –

Antwort

4

In Python 3.X meisten Wörterbuch wie keys Attribute geben eine Ansicht Objekt, das eine Reihe artiges Objekt ist, so dass Sie es nicht konvertieren müssen wieder einzustellen:

>>> d_keys = d.keys() - {"inside",} 
>>> d_keys 
{'fill', 'size', 'angle', 'shape'} 

Oder wenn Sie in python2.x sind, können Sie verwenden dict.viewkeys():

d_keys = d.viewkeys() - {"inside",} 

Aber wenn y Wenn Sie nur ein Element entfernen möchten, können Sie das Attribut pop() verwenden, um das entsprechende Element aus dem Wörterbuch zu entfernen und dann die keys() anzurufen.

>>> d.pop('inside') 
'a->e' 
>>> d.keys() 
dict_keys(['fill', 'size', 'angle', 'shape']) 

In Python 2, da keys() gibt eine Liste Objekt Sie remove() Attribut zum Entfernen eines Elements direkt von den Tasten verwenden können.

-1

Sie können es mit einem Diktat Verständnis zum Beispiel nur zu bekommen, Evens.

d = {1:'a', 2:'b', 3:'c', 4:'d'} 
new_d = {k : v for k,v in d.items() if k % 2 == 0} 

für Ihren Fall wegen Beschwerden.

d = {'shape': 'unchanged', 'fill': 'unchanged', 'angle': 'unchanged',   'inside': 'a->e'} 
new_d = {k:v for k,v in d.items() if k != 'fill'} 
#you can replace the k != with whatever key or keys you want 
+0

Ich denke, das sollte auf eine andere Frage sein. –

+0

warum? Wenn es darum geht, ein Wörterbuch anhand eines Kriteriums zu filtern, beantwortet es dies. –

+0

Weil das Wörterbuch von OP kein Satz nummerierter Schlüssel ist. Ich weiß, dass die Technik verallgemeinerbar ist, aber Antworten sollten das spezifische Problem in der Frage lösen. –

0

Es gibt nicht wirklich eine gute Möglichkeit, dies zu tun, wenn Sie das ursprüngliche Wörterbuch beibehalten müssen.

Wenn Sie dies nicht tun, könnten Sie den Schlüssel, den Sie nicht möchten, bevor Sie die Schlüssel pop bekommen.

d = {'shape': 'unchanged', 'fill': 'unchanged', 'angle': 'unchanged', 'inside': 'a->e', 'size': 'unchanged'} 
d.pop('inside') 
for key in d.keys(): 
    print "key: %s, value: %s" % (key, d[key]) 

Dies wird d, mutieren so wieder, tu das nicht verwenden, wenn Sie alle d woanders brauchen. Sie könnten eine Kopie von d erstellen, aber an diesem Punkt ist es besser, wenn Sie einfach über eine gefilterte Kopie von d.keys() iterieren. Zum Beispiel:

d = {'shape': 'unchanged', 'fill': 'unchanged', 'angle': 'unchanged', 'inside': 'a->e', 'size': 'unchanged'} 
ignored_keys = ['inside'] 
for key in filter(lambda x: x not in ignored_keys, d.keys()): 
    print "key: %s, value: %s" % (key, d[key]) 
+0

sollten Sie anstelle von '% s'' '' '' ''' '' '' verwenden und Formatzeichenfolgen-Methoden verwenden, es ist eher pythonisch. Ganz zu schweigen davon, dass Sie 'd.keys()' hier verschwenderisch verwenden, weil Sie leicht ein Tupel mit Schlüssel erhalten können: value mit 'd.items()' Auch wenn Sie Pops ausgeben, sollten Sie ein Argument von 'None' angeben einige Overhead. –

0
for key in d_keys: 
    if key not in ['inside']: 
     print "key: %s, value: %s" % (key, d[key]) 
+1

Oder erstellen Sie eine Liste wie 'ignore = ['inside',]', und dann 'if key not in ignore ...', was eine allgemeinere Lösung ist, wenn es um mehr als einen speziellen Schlüssel geht. –

0

Nicht sicher, was Sie mit innen benötigen, aber dies wird Ihr Ergebnis geben.

for key in d.keys: 
    if key != 'inside': 
     print "key: %s, value: %s" % (key, d[key]) 
1

eine Quer Version Ansatz:

d = {'shape': 'unchanged', 'fill': 'unchanged', 
    'angle': 'unchanged', 'inside': 'a->e', 'size': 'unchanged'} 

d_keys = [k for k in d.keys() if k != 'inside'] 

print(d_keys) 

Ausgang:

['fill', 'shape', 'angle', 'size'] 


es ein bisschen weiter aus:

def get_pruned_dict(d, excluded_keys): 
    return {k:v for k,v in d.items() if k not in excluded_keys} 

exclude = ('shape', 'inside') 
pruned_d = get_pruned_dict(d, exclude) 

print(pruned_d) 

Ausgabe

{'fill': 'unchanged', 'size': 'unchanged', 'angle': 'unchanged'} 
0

Hier ist eine kleine Benchmark ein paar gute erzielte Lösungen zu vergleichen:

import timeit 

d = {'shape': 'unchanged', 'fill': 'unchanged', 
    'angle': 'unchanged', 'inside': 'a->e', 'size': 'unchanged'} 


def f1(d): 
    return d.viewkeys() - {"inside", } 


def f2(d): 
    return filter(lambda x: x not in ['inside'], d.viewkeys()) 

N = 10000000 
print timeit.timeit('f1(d)', setup='from __main__ import f1, d', number=N) 
print timeit.timeit('f2(d)', setup='from __main__ import f2, d', number=N) 

# 5.25808963984 
# 8.54371443087 
# [Finished in 13.9s] 

Fazit: f1 nicht nur in Bezug auf die Lesbarkeit besser ist, sondern auch in Bezug auf Leistung. In Python 3.x würden Sie stattdessen keys() verwenden.

Also würde ich sagen @Kasramvd Antwort ist die richtige für diesen Beitrag

+0

Wenn ich diesen Code in Python 3 ausführen ('viewkeys' in' keys' ändern), ist 'f2' um einen ähnlichen Betrag schneller als' f1'. Wenn ich es unverändert in Python 2 ausführe, sehe ich 'f1' ebenfalls schneller, was die Ergebnisse in Python 2 bestätigt. –

1

Sie können entfernen() verwenden, eingebaut.

d = {'shape': 'unchanged', 'fill': 'unchanged', 'angle': 'unchanged', 'inside': 'a->e', 'size': 'unchanged'} 

d_keys = list(d.keys()) 
d_keys.remove('inside') 

for i in d_keys: 
    print("Key: {}, Value: {}".format(d_keys, d[d_keys])) 
Verwandte Themen