2017-12-22 3 views
0

Also habe ich die Quelle eines HTML extrahiert und alles in ein großes Wörterbuch umgewandelt. DieseWörterbuch: Überprüfen Sie, ob jedes Element von Schlüssel und Wert gleich ist oder nicht

ist nur ein Beispiel:

d = {fist:mist} 

Mein Ziel ist es, die Zeichen von ihren Indizes zu vergleichen:

(key[0] & value[0], key[1] & value[1], etc.) 

und prüfen, ob die Charaktere sind gleich:

f != m, i == i, s==s, t==t 

Das Beste, was ich tun konnte:

d = {fist:mist} 

difference = 0 
no_difference = 0 

for key, value in d.items(): 
     for char1 in key: 
      pass 
     for char2 in value: 
      pass 
     if char1 != char2: 
     difference += 1 
     if char1 == char2: 
     no_difference +=1 

print(difference) 
print(no_difference) 

Ich freue mich über jede Hilfe.

Edit: Vielen Dank an Glenn Codes, Joe Iddon und Mike Müller!

+0

was wollen Sie Ihre Ausgabe zu sein? Anzahl der Gesamtdifferenz? Richtig/Falsch, wenn * alles * gleich ist? Oder etwas anderes ... –

+0

Was ist Ihre gewünschte Ausgabe für dieses Beispiel dict: 'd = {'Faust': 'Nebel', 'Faust1': 'Nebel22', 'x': 'viele Unterschiede hier'}'? –

+0

@ MikeMüller Nein, das Ziel ist es, die Unterschiede für jedes Schlüssel: Wert-Paar zu bewerten. Ich werde jeden Schlüssel: Wert zu einem neuen Wörterbuch extrahieren und nach den Unterschieden getrennt suchen (ich weiß, dass das ein wenig überkompliziert scheint) – Miggl

Antwort

3

Sie müssen eine Schleife durch die key : value Paare im Wörterbuch. Für jedes Paar müssen Sie herausfinden, wie viele Unterschiede zwischen dem key und dem value bestehen. Dies kann erreicht werden, indem man die Länge einer list ausarbeitet, die nur unterschiedliche Zeichen enthält.

Wir fügen dann diese Länge zu einer Variablen außerhalb der Schleife hinzu, um den Gesamtbetrag zu verfolgen.

d = {"fist":"mist"} 
differences = 0 
for k, v in d.items(): 
    differences += len([i for i,c in enumerate(k) if c != v[i]]) 

print(differences) 

, die für das kleine Beispiel hier, 1 als 'f' und 'm' gibt verschieden sind.


Wenn Sie auch eine Zählung der Anzahl von Zeichen wollen, die übereinstimmt (dh nicht anders), dann können Sie nur den gleichen Prozess, sondern fügen Sie die Länge der key minus die Unterschiede die Anzahl der Zeichen zu erhalten das waren die gleichen:

d = {"fist":"mist"} 
differences = 0 
same = 0 
for k, v in d.items(): 
    differences += len([i for i,c in enumerate(k) if c != v[i]]) 
    same += len(k) - differences 

print(differences) 
print(same) 

wieder die differences als 1 gibt, sondern gibt auch same als 3 (für 'i', 's' und 't').


Wenn Sie nur einen boolean (True/False) Wert, ob es irgendwelche Unterschiede zwischen jeder der Paare wollten, können Sie in einer Zeile die ganze Operation tun:

all(k == v for k,v in d.items()) 

die gibt False in diesem Fall.

+0

Vielen Dank für deine Zeit! – Miggl

+0

@Miggl Bitte akzeptieren Sie die Antwort, um Ihre Wertschätzung zu zeigen (grau -> grünes Häkchen neben Antwort). –

+0

'd = {" fist27 ":" mist "}' gibt mir einen 'IndexError'. –

1

Unter der Annahme, Schlüssel und Wert wird gleich lang sein können Sie tun:

for key, value in d.items(): 
    for i in range(len(key)): 
     if key[i] == value[i]: 
      no_difference +=1 
     else: 
      difference += 1 
+0

Sie müssen nicht wirklich sowohl 'no_difference' als auch' difference' im Auge behalten, da Sie mit der Länge des Schlüssels/Wertes eine von der anderen berechnen können, aber diese Lösung kommt der, die Sie bereits hatten, am nächsten. –

+0

Schlüssel und Wert sind nicht immer die gleiche Länge, aber das half, danke! – Miggl

+0

Ah Sie können dann einfach die Länge dessen verwenden, was der kürzeste Wert, Schlüssel oder Wert ist, als Bereich. Ein guter Weg zu gehen wäre dann, einfach die Ereignisse zu verfolgen, die übereinstimmen. ("no_difference" in diesem Fall) "difference" wäre dann automatisch die Länge dessen, was am längsten ist, wieder key oder value, subtrahiert um den Wert von 'no_difference'. Im Falle von 'fist' und' nisty' würde 'no_difference' 3 werden und" difference "würde 2 werden, da wir' no_difference' von der Länge 'neby' subtrahieren, was 5 - 3 = 2 ist. –

1

ein Wörterbuch mit mehreren Optionen und möglichen unterschiedlichen Längen von Schlüsseln und Werten Unter der Annahme, sollte diese Arbeit:

from itertools import zip_longest 

d = {'fist': 'mist', 'fist1': 'mist22', 'x': 'many differences here'} 

difference = 0 
no_difference = 0 

for k, v in d.items(): 
    for item1, item2 in zip_longest(k, v, fillvalue=''): 
     if item1 == item2: 
      no_difference += 1 
     else: 
      difference += 1 

print('difference:', difference) 
print('no_difference:', no_difference) 

Ausgang:

difference: 25 
no_difference: 6 
+0

Nochmals vielen Dank für das Kommentieren! Ich habe versucht, Ihre Lösung sowohl in eine Funktion als auch extern zu implementieren. Äußerlich scheint es zu funktionieren, aber es druckt zu viele Unterschiede. In der Funktion wird None zurückgegeben. Ich habe deswegen große Kopfschmerzen, mache eine Pause und versuche es dann morgen wieder. Vielen Dank für Ihre Zeit! – Miggl

Verwandte Themen