Seite 1 von 2

Verfasst: Donnerstag 12. November 2009, 12:58
von Hyperion
Jo, danke. Hatte es inzwischen auch kapiert :-)

Ich denke aber auch, dass hier ein dict die richtige Struktur ist.

Verfasst: Donnerstag 12. November 2009, 13:16
von Twilo
Hallo,

ich hatte den Beitrag abgeschickt und dann erst gemerkt, das neue Antworten vorhanden waren. :wink:

Bei der Methode mit den dict muss man jedoch 2 mal das ganze konvertieren, von Listen -> dict -> Listen

Code: Alles auswählen

def group(names, types, values):
    d = {}
    for n, t, v in zip(names, types, values):
        d[n] = {'type': t, 'value': v}   
    return d

def ungroup(d):
    names = []
    types = []
    values = []
    for e in d.keys():
        names.append(e)
        types.append(d[e]["type"])
        values.append(d[e]["value"])
    return names, types, values

names = ["test1", "test2", "test3"]
types = ["text", "text", "text"]
values = ["1", "2", "3"]
names_tmp = ["test2", "test1"]
types_tmp = ["text", "text"]
values_tmp = ["11", "23"]

orig = group(names, types, values)
tmp = group(names_tmp, types_tmp, values_tmp)

orig.update(tmp)

names, types, values = ungroup(orig)

names
types
values

Code: Alles auswählen

In [17]: names
Out[17]: ['test1', 'test3', 'test2']

In [18]: types
Out[18]: ['text', 'text', 'text']

In [19]: values
Out[19]: ['23', '3', '11']
mfg
Twilo

Verfasst: Donnerstag 12. November 2009, 13:25
von Zap
Twilo hat geschrieben:

Code: Alles auswählen

In [17]: names
Out[17]: ['test1', 'test3', 'test2']

In [18]: types
Out[18]: ['text', 'text', 'text']

In [19]: values
Out[19]: ['23', '3', '11']
Die Lösung hat aber nicht mehr die richtige Reihenfolge.

Dann ehr so:

Code: Alles auswählen

def ungroup(g, names):
    return (names, 
            [g[n]["type"] for n in names], 
            [g[n]["value"] for n in names])
Auch nicht super schön aber die Reihenfolge stimmt wenigstens

Verfasst: Donnerstag 12. November 2009, 13:43
von Twilo
Hallo,
Zap hat geschrieben:
Twilo hat geschrieben:

Code: Alles auswählen

In [17]: names
Out[17]: ['test1', 'test3', 'test2']

In [18]: types
Out[18]: ['text', 'text', 'text']

In [19]: values
Out[19]: ['23', '3', '11']
Die Lösung hat aber nicht mehr die richtige Reihenfolge.

Dann ehr so:

Code: Alles auswählen

def ungroup(g, names):
    return (names, 
            [g[n]["type"] for n in names], 
            [g[n]["value"] for n in names])
Auch nicht super schön aber die Reihenfolge stimmt wenigstens
die Reihenfolge ist zum Glück egal - die Reihenfolge muss dann aber bei jeder der 3 Listen genauso getauscht sein.

Wobei gegen die gleiche Reihenfolge nichts einzuwenden ist :)

mfg
Twilo

Verfasst: Donnerstag 12. November 2009, 13:54
von pillmuncher
Ich würde es so machen:

Code: Alles auswählen

def group(ns, ts, vs):
    return dict((n,(n,t,v)) for n,t,v in zip(ns,ts,vs))

def ungroup(d, ns):
    return zip(*(d[n] for n in ns))
Und wenn die Reihenfolge keine Rolle spielt, geht auch das:

Code: Alles auswählen

def ungroup(d):
    return zip(*d.values())
Gruß,
Mick.

*edit*
group geht auch kürzer:

Code: Alles auswählen

def group(ns, ts, vs):
    return dict(zip(ns, zip(ns,ts,vs)))

Verfasst: Donnerstag 12. November 2009, 14:09
von Twilo
Hallo,
pillmuncher hat geschrieben:

Code: Alles auswählen

def ungroup(d): 
    return zip(*d.values())
wo kann ich mehr über das Sternchen erfahren?

Die ungroup Methode müßte nur noch statt 3 Tuples 3 Listen zurückgeben.

Kann man irgendwie die zip-Funktion dazu bewegen, dass sie listen statt tuples zurückgibt?
Ansonsten könnte ich auch folgendes verwenden:

Code: Alles auswählen

def ungroup(d):
    return [list(e) for e in zip(*d.values())]
mfg
Twilo

Verfasst: Donnerstag 12. November 2009, 14:55
von pillmuncher
Twilo hat geschrieben:
pillmuncher hat geschrieben:

Code: Alles auswählen

def ungroup(d):
    return zip(*d.values())
wo kann ich mehr über das Sternchen erfahren?
Im Python Tutorial, Punkt 4.7.4. Der Punkt 4.7.3 darüber könnte zum Verständnis wichtig sein.

Es wäre übrigens besser gewesen, wenn ich gleich itertools.izip verwendet hätte:

Code: Alles auswählen

from itertools import izip

def group(ns, ts, vs):
    return dict(izip(ns,izip(ns,ts,vs)))

def ungroup(d):
    for e in izip(*d.values()):
        yield list(e)
ungroup ist so schöner, finde ich.

Gruß,
Mick.

Verfasst: Donnerstag 12. November 2009, 15:06
von Zap
Nice ;) Und schon wurde wieder ein Problem aufs nötigste eingedampft *g

Verfasst: Donnerstag 12. November 2009, 15:06
von EyDu
Dann kannst du auch gleich imap verwenden:

Code: Alles auswählen

def ungroup(d):
    return imap(list, izip(*d.values()))