mehrere Listen durchlaufen

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.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Jo, danke. Hatte es inzwischen auch kapiert :-)

Ich denke aber auch, dass hier ein dict die richtige Struktur ist.
Twilo
User
Beiträge: 109
Registriert: Mittwoch 10. Januar 2007, 19:17
Wohnort: Berlin
Kontaktdaten:

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
[url=http://www.farb-tabelle.de/][b]Farbtabelle[/b][/url]
Zap
User
Beiträge: 533
Registriert: Freitag 13. Oktober 2006, 10:56

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
Twilo
User
Beiträge: 109
Registriert: Mittwoch 10. Januar 2007, 19:17
Wohnort: Berlin
Kontaktdaten:

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
[url=http://www.farb-tabelle.de/][b]Farbtabelle[/b][/url]
Benutzeravatar
pillmuncher
User
Beiträge: 1484
Registriert: Samstag 21. März 2009, 22:59
Wohnort: Pfaffenwinkel

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)))
Zuletzt geändert von pillmuncher am Donnerstag 12. November 2009, 14:13, insgesamt 1-mal geändert.
In specifications, Murphy's Law supersedes Ohm's.
Twilo
User
Beiträge: 109
Registriert: Mittwoch 10. Januar 2007, 19:17
Wohnort: Berlin
Kontaktdaten:

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
[url=http://www.farb-tabelle.de/][b]Farbtabelle[/b][/url]
Benutzeravatar
pillmuncher
User
Beiträge: 1484
Registriert: Samstag 21. März 2009, 22:59
Wohnort: Pfaffenwinkel

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.
In specifications, Murphy's Law supersedes Ohm's.
Zap
User
Beiträge: 533
Registriert: Freitag 13. Oktober 2006, 10:56

Nice ;) Und schon wurde wieder ein Problem aufs nötigste eingedampft *g
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Dann kannst du auch gleich imap verwenden:

Code: Alles auswählen

def ungroup(d):
    return imap(list, izip(*d.values()))
Das Leben ist wie ein Tennisball.
Antworten