2016-12-05 2 views
-2

Ich habe ein Wörterbuch:Python - Vergleich von Werten im gleichen Wörterbuch

d = {'Trump': ['MAGA', 'FollowTheMoney'], 
    'Clinton': ['dems', 'Clinton'], 
    'Stein': ['FollowTheMoney', 'Atlanta']} 

Ich mag die doppelten Strings in der Liste der Zeichenkette entfernen, die ein Wert für den Schlüssel.

Für dieses Beispiel das gewünschte Ergebnis ist

update_d = {'Trump': ['MAGA'], 
      'Clinton': ['dems', 'Clinton'], 
      'Stein': ['Atlanta']} 

Es gibt eine ähnliche Frage gestellt war here, aber ich habe nicht in der Lage gewesen, es für meine Zwecke zu ändern.

Mein Versuch:

new_d = {} 
for key in d: 
    for key2 in d: 
     lst = d[key] 
     lst2 = d[key2] 

     for string in lst: 
      for string2 in lst2: 
       if string not in new_d: 

Mein Problem ist, dass ich die Werte aller Schlüssel vergleichen möchten und die Duplikate entfernen. Aber ich sehe nicht, wie dies erreicht werden kann

+0

Entschuldigung für die schreckliche Formatierung. – GRAp

+0

Also welchen Code * hast du geschrieben, und was genau ist das Problem damit? Gib ein [mcve], das ist kein Code-Schreibdienst. – jonrsharpe

+0

Sorry, aktualisiertes Posting mit einem Versuch – GRAp

Antwort

0

nicht so elegant wie mit Counter, aber tut Entfernen von Duplikaten ohne Verwendung von Modulen:

d = {'Trump': ['MAGA', 'FollowTheMoney'], 
    'Clinton': ['dems', 'Clinton'], 
    'Stein': ['FollowTheMoney', 'Atlanta']} 

dupvals = [item for sublist in d.values() for item in sublist] # get all values from all keys into a list 
dups = [] # list to hold duplicates 

for i in dupvals: 
    if dupvals.count(i) > 1: 
     dups.append(i) 

dupvals = set(dups) # keep only one item for each duplicated item 

new_d = {} 

for key,values in d.items(): 
    for value in values: 
     if not value in dupvals: 
      new_d.setdefault(key, []).append(value) 

print new_d # {'Clinton': ['dems', 'Clinton'], 'Trump': ['MAGA'], 'Stein': ['Atlanta']} 
+0

DANKE. Es funktioniert perfekt. Einfach nur neugierig, was die Variable 'dupvals' genau macht. – GRAp

+0

Ich bin froh, dass ich helfen kann. Entschuldigung, ich hätte mehr mit Kommentaren erklären sollen. Ich habe 'dupvals' als' liste'-Variable verwendet, um "doppelte Werte in allen Werten" darzustellen. Es erhält alle Werte von allen Schlüsseln. Durchlaufen Sie anschließend die Liste "duvals", um alle Elemente zu finden, die mehrmals vorkommen. – davedwards

+0

Ok. Seht, ich wünschte, ich könnte mir so etwas einfallen lassen. Nochmals vielen Dank, meine Lösung funktionierte nicht und war wirklich inkohärent. – GRAp

1

Sie können Counter verwenden, um zu zählen, wie oft jeder Wert in d erscheint.

d = {'Trump': ['MAGA', 'FollowTheMoney'], 
    'Clinton': ['dems', 'Clinton'], 
    'Stein': ['FollowTheMoney', 'Atlanta']} 

from collections import Counter 

c = Counter(x for xs in d.values() for x in xs) 

In diesem Beispiel ist der Wert von c

Counter({'Atlanta': 1, 
     'Clinton': 1, 
     'FollowTheMoney': 2, 
     'MAGA': 1, 
     'dems': 1}) 

, für die dann Werte wählen die Zählung genau 1.

update_d = {k: [v for v in vs if c[v] == 1] for k, vs in d.items()} 
+0

Ich habe das Wörterbuch stark verkürzt, so dass das obige Beispiel nicht funktionieren würde. Ich kann auch keine Module für diese Aufgabe verwenden. Ich habe versucht, eine for-Schleife zu verwenden, um über die Schlüssel zu iterieren, aber ich kann anscheinend nicht in der Lage sein, verschiedene Werte des gleichen Wörterbuchs zu vergleichen, das eine geschachtelte for-Schleife verwendet. – GRAp

+0

@GRAp Wenn Sie 'Counter' in Ihrer Aufgabe nicht verwenden können, schlage ich vor, dass Sie darüber nachdenken, wie' Counter' implementiert wird und implementieren Sie dann (den zählenden Teil) selbst. Es ist nicht schwer. –

+0

So, für jedes Auftreten einer Zeichenfolge, inkrementiere ich eine neue Variable sagen, i durch 1. (i + = 1). Aber ich versuche, die Beziehung zwischen dem Wert und dem Schlüssel beizubehalten, und ich weiß nicht, wie ich das anstellen soll. – GRAp

Verwandte Themen