Ich habe zwei Arrays von Clustern, die auf Modularität basieren.

Jedes Array enthält ein anderes Array mit 2 bis 7 großen Namen, Vornamen und Nachnamen, sodass sich innerhalb eines Arrays keine Namen wiederholen. Es sollte jedoch eine Überlappung zwischen den beiden übergeordneten Arrays geben.

[[John, Mary], [Jane, Alex, Harry], [Rob, Sarah, Nadia]]  
[[Nadia, John, Mary], [Rob, Sarah, Eric], [Jane, Harry, Jake]]

Ich möchte, dass [Nadia, John, Mary] bei Eingabe mit [John, Mary] oder [Rob, Sarah, Eric] bei Eingabe von [Rob, Sarah, Nadia] mit einiger Sicherheit zurückgegeben wird.

Was ist der beste Weg, um die wahrscheinlichsten Übereinstimmungen wie diese zwischen zwei Arrays von Arrays zu finden? Ordnung spielt keine Rolle

0
SharpObject 6 Aug. 2015 im 18:15

3 Antworten

Beste Antwort

Sie können max mit einer speziellen Schlüsselfunktion verwenden und die Elemente aus der ersten Unterliste zählen, die in der zweiten Unterliste erscheinen.

for x in list1:
    y = max(list2, key=lambda y: sum(1 for w in x if w in y))
    print x, y

Da die Reihenfolge keine Rolle spielt und die Namen in einer Unterliste eindeutig sind, verwenden Sie stattdessen Listen mit Mengen und verwenden Sie die Schnittmenge von Mengen:

    y = max(list2, key=lambda y: len(x & y))
0
tobias_k 6 Aug. 2015 im 15:23

Ich nehme an, Sie könnten ein lambda als key Argument von max verwenden, um die Anzahl der geschnittenen Elemente zu zählen

>>> s = ['John', 'Mary']
>>> max(l2, key = lambda i: len(set(s).intersection(i)))
['Nadia', 'John', 'Mary']

Sie können also ein Listenverständnis verwenden, um aus der zweiten Liste eine Liste mit übereinstimmenden Listen zu erstellen, die mit der ersten übereinstimmen

>>> [max(l2, key = lambda i: len(set(j).intersection(i))) for j in l1]
[['Nadia', 'John', 'Mary'], ['Jane', 'Harry', 'Jake'], ['Rob', 'Sarah', 'Eric']]
0
CoryKramer 6 Aug. 2015 im 15:24

Auf der hohen Ebene würde ich jedes Array auf einen Vektor von binären Merkmalen reduzieren (wobei Sie eine 0 haben würden, wenn ein gegebener Name nicht vorhanden wäre, und eine 1, wenn dies der Fall wäre) und dann den paarweisen Kosinusabstand aller berechnen Vektoren. Die Vektoren mit dem geringsten Abstand haben die meisten Namen gemeinsam.

Alternativ können Sie einige lokalitätssensitive Hashing-Methoden ausprobieren. Das klingt auch nach möglicherweise Hausaufgaben, daher habe ich keinen Code angegeben

0
Cody Braun 6 Aug. 2015 im 15:23