2016-03-29 1 views
0

Ich denke, es ist am besten, ein Beispiel zu zeigen, was ich versuche zu tun. Der Punkt ist, dass ich einen eleganten Weg davon suche.Auf der Suche nach einem eleganten Weg, die Schnittmenge zwischen zwei Listen von Wörtern Tupel in verschiedenen Ordnungen zu finden

Lassen Sie uns sagen, ich habe zwei Listen von Tupeln:

x = [('a', 'c', 'e'), ('k', 'n')] 
y = [('e', 'd', 'w'), ('c', 'a', 'e'), ('n', 'k')] 
z = set(x).intersection(y) 

Wenn ich den Schnittpunkt zwischen x und y berechnen ich eine leere Menge zu bekommen.

Mein Ziel ist es, herauszufinden, dass es zwei Elemente in y gibt, die mit den zwei Elementen in x identisch sind, während mir die unterschiedliche Reihenfolge der Tupel egal ist. Zusätzlich möchte ich den Index des passenden Elements der Liste y erhalten.

Für mich sind x [0] und y [1] die gleichen (wieder, kümmern sich nicht um die Reihenfolge) und der Index, den ich erhalten möchte, ist 1, gleich für x [1] und y [2] Beide sind für mich gleich und sollten in diesem Fall den Index 2 zurückgeben.

Irgendwelche Ideen, wie man das elegant macht?

Antwort

4

Können Sie nicht Ihre x und yset s machen? Z. B .:

x = [('a', 'c', 'e'), ('k', 'n')] 
y = [('e', 'd', 'w'), ('c', 'a', 'e'), ('n', 'k')] 
set_x = set(frozenset(a) for a in x) 
set_y = [frozenset(a) for a in y] 
[y_element in set_x for y_element in set_y] 

kehrt: [False, True, True]

Wenn Sie die aktuellen Indizes wollen:

[i for i, y_element in enumerate(set_y) if y_element in set_x] 

kehrt: [1, 2]

+0

Ich glaube, er die Indizes in y wollte, so aufzählen? Würde es auch ermöglichen, set_x zu einem Satz von frozensets zu machen. –

+0

Verwenden Sie stattdessen frozensets. Machen Sie set_x zu einem Set anstelle einer Liste. – IceArdor

+1

In diesem Fall könnten Sie einfach die Rollen von 'set_x' und' set_y' wechseln, um '[set_y.index (x_element) für x_element in set_x zu erhalten, wenn x_element in set_y]' '' [1, 2] 'zurückgibt. – acdr

Verwandte Themen