Auslesen einzelner Summanden aus einer Summe

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
ElSids
User
Beiträge: 16
Registriert: Montag 25. Juni 2007, 13:15
Wohnort: Corciano/Italien

Häufig sind scheinbar einfache Aufgaben doch nicht so einfach, auch wenn mann sich schon nah am Ziel wähnt.

Beschreibung des Verwendungszwecks:
In einer wx.Python-Anwendung habe ich eine CheckListBox mit mehreren Auswahlmöglichkeiten. Die Liste stammt aus einem Dictonary.
Beispiel:

Code: Alles auswählen

mylist= {1:"erster",
2:"zweiter",
4:"dritter",
8:"vierter",
16:"fünfter",
32:"sechster"}
Der Anwender kann über die CheckBoxen mehrerer Listenpunkte auswählen.
Zurückgegeben wird eine Liste mit den Keys. Sagen wir, "zweiter, "vierter" und "fünfter" sind ausgwählt, so enthält die Liste [2,8,16].

Dieses Integer der Keys werden summiert zu 26 und in einen Rekord einer Datenbank gespeichert.
Dieses Speichern von Mehrfachwahlen dürfte, denke ich, allgemein bekannt sein

Frage und Problem
Die Summanden der Summe 26 sind eindeutig belegt. Es gibt nur eine Kombinationsmöglichkeit (eben 2,8,16).

Wie lese ich am einfachsten die Summanden wieder aus der gespeicherten Summe aus (bei gegebener obiger Liste mylist) ?
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

ElSids hat geschrieben:Wie lese ich am einfachsten die Summanden wieder aus der gespeicherten Summe aus (bei gegebener obiger Liste mylist) ?
Hallo ElSids!

Es geht wahrscheinlich einfacher:

Code: Alles auswählen

>>> mydict= {1:"erster",
... 2:"zweiter",
... 4:"dritter",
... 8:"vierter",
... 16:"fünfter",
... 32:"sechster"}
>>> selection = 26
>>> for key, value in mydict.iteritems():
...     if selection & key == key:
...         print value
...     
zweiter
vierter
fünfter
>>> 
EDIT:

Code: Alles auswählen

Erklärung:

26 = 00011010
2  = 00000010
8  = 00001000
16 = 00010000

00011011 & 00000010 = 00000010
00011011 & 00001000 = 00001000
00011011 & 00010000 = 00010000
mfg
Gerold
:-)

PS: Das ist ein Dictionary und keine Liste. Nenne es nicht "mylist". :roll:
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
ElSids
User
Beiträge: 16
Registriert: Montag 25. Juni 2007, 13:15
Wohnort: Corciano/Italien

Vielen Dank,

ich wusste, dass die Lösung nicht so kompliziert sein konnte.
Selbstverständlich handelt es sich um ein Dictonary und nicht um eine Liste.

Auf die Lösung mit '&' zur binären Addition bin ich nicht gekommen.
Ich hatte mit Oktalzahlen herumexperimentiert, ohne sonderliches Ergebnis.

ElSids
Antworten