2017-03-20 5 views
7

Da der Schlüssel mehrere Werte hat und ich möchte den gleichen Schlüssel wie den Schlüssel entfernen? Das heißt, ich habe einen Wörterbuch jumps:Python: Wie entferne ich einen Wert aus einem Diktat, wenn es genau mit dem Schlüssel übereinstimmt?

jumps = {'I6': ['H6', 'I6', 'I5'], 'T8' : ['T6', 'S6', 'T8']} 

Und ich mag den Wert 'I6' vom 'I6' Schlüssel löschen und auch 'T8' vom 'T8' Schlüssel. Wie könnte ich das tun? Ich bin dabei, die Strings mit den Werten zu analysieren.

+0

Die Antwort kann von [hier] (http://stackoverflow.com/questions/5844672/delete-an-item-from-a-dictionary) gefunden werden. Das ist doppelte Frage. – bismute

+2

@bismute: In dieser Antwort wird eine ** gesamte ** Taste und der zugehörige Wert gelöscht, hier werden die Werte "manipuliert". –

Antwort

9

können Sie verwenden, um eine Einzeiler sowohl mit Wörterbuch Verständnis und Liste Verständnis:

result = {k:[vi for vi in v if k != vi] for k,v in jumps.items()}

Daraus ergibt sich:

>>> {k:[vi for vi in v if k != vi] for k,v in jumps.items()} 
{'T8': ['T6', 'S6'], 'I6': ['H6', 'I5']} 

Beachten Sie, dass alle entfernen wird Elemente aus den Listen, die dem Schlüssel entsprechen. Außerdem wird der Removal-Prozess für alle Schlüssel durchgeführt.

Der Code funktioniert wie folgt: Wir iterieren jeden Schlüssel-Wert-Paark,v im jumps Wörterbuch. Dann für jedes solch ein Paar, konstruieren wir einen Schlüssel in dem resultierenden Wörterbuch und assoziieren [vi for vi in v if k != vi] damit. Das ist ein Listenverständnis, in dem wir alle Werte von v herausfiltern, die gleich k sind. Es bleiben also nur die vi s (in dieser Reihenfolge), die k != vi sind.

+1

Das macht so viel Sinn und funktioniert perfekt, und außerdem danke für Ihre hilfreiche Erklärung! Ich werde dies als die Antwort markieren, wenn es mir erlaubt ist! –

0

Werke für mich

jumps = {'I6': ['H6', 'I6', 'I5'], 'T8' : ['T6', 'S6', 'T8']} 

key = 'I6' 

if key in jumps[key]: 
    jumps[key].remove(key) 

print(jumps) 
3

Es gibt ein Kommando gebaut, die so genannte remove, die ein Element aus einer Liste entfernen. Wir können mit dem Zugriff auf das Element von dictionary mit einem Zeichenfolgenschlüssel beginnen. Dieser Wert ist zufällig eine Liste, die wir dann mit dem Befehl remove aufrufen können.

Hier ist die Liste zu demonstrieren:

jumps = { 
    'I6': [ # we are accessing this value that happens to be a list 
     'H6', 
     'I6', #then Python will sort for and remove this value 
     'I5' 
    ], 
    'T8' : [ 
     'T6', 
     'S6', 
     'T8' 
    ] 
} 



jumps = {'I6': ['H6', 'I6', 'I5'], 'T8' : ['T6', 'S6', 'T8']} 

jumps['I6'].remove('I6') 
jumps['T8'].remove('T8') 
print(jumps) 
0

Die andere Möglichkeit könnte sein:

{vals.remove(val) for key,vals in jumps.items() for val in vals if val == key} 

Da es auf die Werteliste oder ein Array verweist, die Entfernung von der Liste wirkt sich in Werte von jumps.

+0

Aber '.remove (..)' gibt 'None' zurück und läuft außerdem in * O (n) * ... –

+0

Nach dem Aufruf würde es aber die 'Sprünge' ändern.Für die Zeitkomplexität ist es vielleicht nicht effizient, aber wäre es nicht platzsparend, da wir nichts außer "Sprüngen" verwenden ('{None}' wäre zusätzlicher Platz)? – 0p3n5ourcE

5
for key in jumps: 
    jumps[key].remove(key) 
Verwandte Themen