Seite 1 von 1

Gleicher Value, neuer Key; alten Key löschen

Verfasst: Montag 3. November 2008, 12:12
von __marcus__

Code: Alles auswählen

q = {0: 'foo'}
q[1] = q[0]
del(q[0])
Ist es möglich einem Value einen neuen Key zuzuweisen oder geht das nur genau so?

Verfasst: Montag 3. November 2008, 12:24
von HWK
Das dürfte nur so gehen. Falls Du aber nur Keys ändern willst, solltest Du Keys und Values tauschen.
MfG
HWK

Re: Gleicher Value, neuer Key; alten Key löschen

Verfasst: Montag 3. November 2008, 12:32
von Qubit
__marcus__ hat geschrieben:

Code: Alles auswählen

q = {0: 'foo'}
q[1] = q[0]
del(q[0])
Ist es möglich einem Value einen neuen Key zuzuweisen oder geht das nur genau so?

Code: Alles auswählen

q.update({1:q.pop(0)})

Re: Gleicher Value, neuer Key; alten Key löschen

Verfasst: Montag 3. November 2008, 12:49
von __marcus__
Qubit hat geschrieben:

Code: Alles auswählen

q.update({1:q.pop(0)})
Ist das nicht nur ein anderer Umweg zum selben Ziel?

Verfasst: Montag 3. November 2008, 12:54
von HWK
So geht es natürlich auch:

Code: Alles auswählen

q[0] = q.pop(1)
Ist aber vom Prinzip nichts anderes als die erstgenannte Lösung, nämlich einen Eintrag löschen und einen neuen erzeugen.

Edit: zu spät

Verfasst: Montag 3. November 2008, 16:29
von barfoos
Ich hab auf http://docs.python.org/c-api/dict.html folgendes gefunden:

The dictionary p should not be mutated during iteration. It is safe (since Python 2.1) to modify the values of the keys as you iterate over the dictionary, but only so long as the set of keys does not change. For example:

Code: Alles auswählen

PyObject *key, *value;
Py_ssize_t pos = 0;

while (PyDict_Next(self->dict, &pos, &key, &value)) {
    int i = PyInt_AS_LONG(value) + 1;
    PyObject *o = PyInt_FromLong(i);
    if (o == NULL)
        return -1;
    if (PyDict_SetItem(self->dict, key, o) < 0) {
        Py_DECREF(o);
        return -1;
    }
    Py_DECREF(o);
}
Hilft das evtl. weiter? Ich weiß nicht, was da genau gemacht wird, aber zumindest steht da, dass man den Wert eines keys ändern darf.

gruß
barfoos

Verfasst: Montag 3. November 2008, 16:38
von HWK
Das Beispiel scheint lediglich den value eines key-value-Paares zu ändern. Der Wert des keys wird nicht geändert. values ist hier etwas doppeldeutig.
MfG
HWK

Verfasst: Montag 3. November 2008, 22:02
von birkenfeld
HWK hat geschrieben:Edit: zu spät
Ist dafür aber die schönste Lösung :)