2016-07-10 8 views
-3

I haben zwei Sätze wie folgt:Unterschied zwischen Tupeln (alles oder nichts)

house_1 = {('Gale', '29'), ('Horowitz', '65'), ('Galey', '24')} 
house_2 = {('Gale', '20'), ('Horowitz', '65'), ('Gale', '29')} 

Jedes Tupel in jedem Satz enthält Attribute, die eine Person darstellen. Ich muss einen speziellen Fall der symmetrischen Set-Differenz zwischen house_1 und house_2 finden: die Differenz muss nur bestätigt werden, wenn alle Elemente der Tupel nicht übereinstimmen und keiner von ihnen.

Aus den oben genannten Mengen, house_1^house_2 ergibt:

{('Gale', '20'), ('Galey', '24')} 

was ausgezeichnet ist. Doch in den folgenden Sätzen:

house_1 = {('Gale', '24')} 
house_2 = {('Gale', '29')} 

house_1^house_2 noch tun ergibt:

{('Gale', '24'), ('Gale', '29')} 

Das ist nicht das, was ich will. Ich brauche den Satzunterschied nur dann auszugeben, wenn beide Elemente in den Tupeln nicht übereinstimmen. In diesem Fall stimmt Gale überein, daher sollten diese beiden Tupel nicht in der Ausgabe enthalten sein.

Alle Einblicke werden sehr geschätzt.

LÖSUNG:

schrieb ich die folgende Funktion dieses Problem zu lösen:

for counter_H1, member_H1 in enumerate(house_1): 
    for counter_H2, member_H2 in enumerate(house_2): 
     if (member_H1[0] == member_H2[0]) and (member_H1[1] == member_H2[1]): 
      break 

     if (member_H1[0] != member_H2[0]) and (member_H1[1] != member_H2[1]) and (counter_H2 == len(house_2) - 1): 
      print(member_H1, member_H2) 
+0

Ihre Operation ist unterspezifiziert. Sie scheinen eine Art implizite Bijektion anzunehmen, bei der jedes Element eines Satzes mit einem bestimmten Element des anderen Satzes übereinstimmt. Warum ist '('Gale', '20')' in der symmetrischen Differenz enthalten, wenn es in der ersten Menge mit '('Gale', '29')' verglichen werden konnte? – user2357112

+0

@ user2357112 Ich folge deinem letzten Satz nicht. Kannst du es ausarbeiten? – lostsoul29

+0

Sie sollten Verständnis verwenden. Aber ich denke, dass du mit Diktaten gehen solltest, nicht mit Sätzen. –

Antwort

1

Sie könnten die Vorkommen von Namen im Ergebnis und Druck nur Tupel, die mit dem Grafen den Namen entsprechen zählen von 1:

from collections import defaultdict 

count = defaultdict(list) 

for x in house_1^house_2: 
    count[x[0]].append(x) 
for v in count.values() 
    if len(v) == 1: 
     print(*v) 
+0

Das hat funktioniert, danke! – lostsoul29

+0

Ich habe ein Problem mit Ihrer Antwort gefunden. Wenn ich die Reihenfolge der Elemente der Tupel ändere, funktioniert es nicht. Zum Beispiel, wenn die Sets jetzt 'house_1 = {('24', 'Gale')}' und 'house_2 = {('29', 'Gale')}' sind, ist die Ausgabe '(' 29 ',' Gale ') (' 24 ',' Gale ') 'obwohl Gale passt. – lostsoul29