Ich bin mit ein bisschen ein Rätsel arbeiten:Python: Wie alle Kombinationen von Listen von Tupeln zu erzeugen, ohne Inhalt des Tupels Wiederholung
ein Wörterbuch mit Tupeln für Schlüssel Gegeben: dictionary = {(p,q):n}
, ich brauche eine erzeugen Liste neuer Wörterbücher jeder Kombination, so dass sich weder p noch q innerhalb des neuen Wörterbuchs wiederholen. Und während der Erzeugung dieser Liste von Wörterbüchern oder danach, wähle eines der Wörterbücher als das gewünschte aus, basierend auf einer Berechnung unter Verwendung der Wörterbuchwerte.
Beispiel dafür, was ich meine (aber viel kleiner):
dictionary = {(1,1): 1.0, (1,2): 2.0, (1,3): 2.5, (1,4): 5.0, (2,1): 3.5, (2,2): 6.0, (2,3): 4.0, (2,4): 1.0}
wird
listofdictionaries = [{(1,1): 1.0, (2,2): 6.0}, {(1,1): 1.0, (2,3): 4.0}, (1,1): 1.0, (2,4): 1.0}, {(1,2): 2.0, (2,1): 3.5}, {(1,2): 2.0, (2,3): 4.0},
usw.
ein Wörterbuch wie: {(1,1): 1.0, (2,1): 3.5}
weil q Wiederholungen nicht zulässig ist.
Jetzt meine schluchzende Geschichte: Ich bin ganz neu in der Codierung ... aber ich habe versucht, dieses Skript zu schreiben, um einige meiner Daten zu analysieren. Aber ich denke auch, dass es ein interessantes Algorithmusrätsel ist. Ich habe etwas geschrieben, das mit sehr kleinen Wörterbüchern funktioniert, aber wenn ich ein großes eingabe, dauert es viel zu lange (unten kopiert). In meinem Skriptversuch habe ich tatsächlich eine Liste von Kombinationen von Tupeln erzeugt, die ich später im Skript als Verweis auf mein Hauptwörterbuch verwende. Ich werde es unten kopieren:
Die Wörterbuch Tupel Schlüssel wurden zwei Listen erzeugt werden: „ExpList1“ und „ExpList2“
#first, I generate all the tuple combinations from my ExpDict dictionary
combos =(itertools.combinations(ExpDict,min(len(ExpList1),len(ExpList2))))
#then I generate a list of only the combinations that don't repeat p or q
uniquecombolist = []
for foo in combos:
counter = 0
listofp = []
listofq = []
for bar in foo:
if bar[0] in listofp or bar[1] in listofq:
counter=+1
break
else:
listofp.append(bar[0])
listofq.append(bar[1])
if counter == 0:
uniquecombolist.append(foo)
Nach dieser Liste zu erzeugen, habe ich eine Funktion, um alle die Anwendung Dictionary-Kombinationen (Iterieren durch die Tupel-Listen und Aufruf ihrer jeweiligen Werte aus dem Master-Dictionary) und wählen Sie die Kombination mit dem kleinsten resultierenden Wert aus dieser Funktion.
Ich habe auch versucht, die Funktion beim Iterieren durch die Kombinationen die eindeutigen p, q Einsen auszuwählen und dann zu überprüfen, ob der resultierende Wert kleiner ist als der vorherige und es behalten, wenn es ist (das ist, anstatt diese Liste zu erzeugen) uniquecombolist ", am Ende erzeuge ich nur die letzte Tupel-Liste) - dauert immer noch zu lange.
Ich denke, die Lösung liegt in der Einbettung der p, q-No-Repeat und der endgültigen Auswahl-Funktion während der Generierung von Kombinationen. Ich habe nur Mühe, meinen Kopf darum zu wickeln, wie man das macht.
Danke fürs Lesen! Sara
EDIT:
Um zu klären, I eine Alternative zu meinen Code geschrieben, die die endgültige Funktion enthält (im Grunde root mean squares) auf die Sätze von Paaren.
`combos =(itertools.combinations(ExpDict,min(len(ExpList1),len(ExpList2))))
prevRMSD = float('inf')
for foo in combos:
counter = 0
distanceSUM = 0
listofp = []
listofq = []
for bar in foo:
if bar[0] in listofp or bar[1] in listofq:
counter=+1
break
else:
listofp.append(bar[0])
listofq.append(bar[1])
distanceSUM = distanceSUM + RMSDdict[bar]
RMSD = math.sqrt (distanceSUM**2/len(foo))
if counter == 0 and RMSD< prevRMSD:
chosencombo = foo
prevRMSD = RMSD`
Also, wenn ich die RMS-Berechnung während der eingestellten Generation übernehmen könnte und halten nur die kleinste, denke ich, dass mein kombinatorisches Problem lösen.
Möchten Sie alle möglichen Sätze von Paaren generieren, die Ihren Kriterien entsprechen? Oder die mögliche Größe 'n' Sätze von Paaren, wobei' n' die Länge der kleineren Erzeugungsliste ist? –
@ JaredGoguen jedes Paar ist ein einzelner Eintrag in der Menge. Die Menge enthält n Paare von Paaren, da p und q nicht wiederholt werden können, so dass sie auf die Größe der kleineren Erzeugungsliste beschränkt werden muss. Ich möchte jeden möglichen Satz erzeugen, wenn ich zwei Listen von Tupelpaaren (oder zwei Wörterbücher mit Tupelschlüsseln) gebe. – Sara
Ich habe versucht, den Code für itertools.combinations zu suchen, aber ich kann ehrlich gesagt nicht genug Sinn machen, um unter meinen eigenen Bedingungen für Kombinationen und sogar die letzte Funktion, die ich anwenden muss, zu arbeiten. Ich habe mir https://stackoverflow.com/questions/24907913/explain-combination-function-of-python-module-itertools angeschaut aber trotzdem nicht wirklich verstanden, wie es leider funktioniert. Wie ich in meinem Post gesagt habe, bin ich sehr neu (ich habe ein anderes Skript geschrieben und habe noch nie Kurse in Informatik absolviert), vielleicht beiße ich mehr ab, als ich kauen kann. – Sara