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
3 Antworten
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))
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']]
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
Verwandte Fragen
Neue Fragen
python
Python ist eine dynamisch typisierte Mehrzweck-Programmiersprache mit mehreren Paradigmen. Es wurde entwickelt, um schnell zu lernen, zu verstehen, zu verwenden und eine saubere und einheitliche Syntax durchzusetzen. Bitte beachten Sie, dass Python 2 ab dem 01.01.2020 offiziell nicht mehr unterstützt wird. Fügen Sie für versionenspezifische Python-Fragen das Tag [python-2.7] oder [python-3.x] hinzu. Wenn Sie eine Python-Variante (z. B. Jython, PyPy) oder eine Bibliothek (z. B. Pandas und NumPy) verwenden, fügen Sie diese bitte in die Tags ein.