Elemente aus Listen-Unterliste löschen

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
andrewas
User
Beiträge: 3
Registriert: Montag 31. Juli 2017, 15:26

Hallo zusammen,
Ich stecke gerade in einer Tretmühle und finde nicht alleine heraus.
Mein Programm soll die Möglichkeiten bei (Killer-)Sudoku berechnen. Wenn ein Twin (nur zwei mögliche Zahlen) auftritt, sollen in der Spalte bei den anderen Möglichkeiten eben diese beiden Zahlen entfernt werden.
Das Programm selber hat diese Möglichkeiten schon generiert, es geht jetzt darum, die Twins aus der Liste der Möglichkeiten der anderen zu entfernen.

Code: Alles auswählen

twins = [(1, 2)] # dies ist das Format, wie mir die Twins ausgegeben werden, das Programm generiert diese automatisch
moeglichkeiten = [(1, 5, 9), (1, 6, 8), (2, 4, 9), (2, 5, 8), (2, 6, 7), (3, 4, 8), (3, 5, 7), (4, 5, 6)] # Dies sind die möglichen Werte (im Killer-Sudoku) Das Feld hat den Wert 15
Ich möchte im ersten Schritt dass die Werte 1 und 2 aus den Möglichkeiten entfernt werden, dass somit herauskommt :

Code: Alles auswählen

neue_moeglichkeiten = [(5, 9), (6, 8), (4, 9), (5, 8), (6, 7), (3, 4, 8), (3, 5, 7), (4, 5, 6)]
Im weiteren kann ich dann über die neuen Möglichkeiten iterieren und ungültige Werte rausschmeissen. (die ersten 5 Elemente in neue_moeglichkeiten)

Das ganze war bisher eine for-Schleifen-Orgie, da ich die Einzelwerte der Listenelemente zum Weiterverarbeiten brauche und somit über die Möglichkeiten und die Twins mittels FOR-Schleifen iterieren muss.

Gefunden habe ich Listcomprehension, bekomme die aber nicht hin.

Code: Alles auswählen

moeglichkeiten = grid[stelle] # hier kommt als Ergebnis obige Liste rein : [(1, 5, 9), (1, 6, 8), (2, 4, 9), (2, 5, 8), (2, 6, 7), (3, 4, 8), (3, 5, 7), (4, 5, 6)]
neue_moeglichkeiten = [x for x in moeglichkeiten if x not in grid[key]] # in grid[key] stehen die zu löschenden Zahlen [(1, 2)]
Ich habe gerade den Gehirn-Verbieger. Habt ihr einen Hinweis ?

Vielen Dank
Andi
Benutzeravatar
__blackjack__
User
Beiträge: 13103
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Suchst Du eventuell so etwas‽

Code: Alles auswählen

In [14]: from operator import or_

In [15]: from functools import reduce

In [16]: twins

Out[16]: [(1, 2)]

In [17]: moeglichkeiten
Out[17]: 
[(1, 5, 9),
 (1, 6, 8),
 (2, 4, 9),
 (2, 5, 8),
 (2, 6, 7),
 (3, 4, 8),
 (3, 5, 7),
 (4, 5, 6)]

In [18]: t = reduce(or_, map(set, twins))

In [19]: t
Out[19]: {1, 2}

In [20]: [m for m in moeglichkeiten if not t.intersection(m)]
Out[20]: [(3, 4, 8), (3, 5, 7), (4, 5, 6)]
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
andrewas
User
Beiträge: 3
Registriert: Montag 31. Juli 2017, 15:26

Ja, vielen Dank.
Ich habe deinen Vorschlag gerade ausprobiert, er funktioniert gut und bringt das gewünschte Ergebnis bei mir !
Die Funktionsweise ergründe ich aber erst morgen :)
Antworten