Seite 1 von 1
2 Listen "Reisverschluß-artig" verknüpfen
Verfasst: Mittwoch 25. April 2007, 18:12
von .robert
Hallo,
ich bin ganz neu in Python und auf der Suche nach einer Funktion, die ähnlich wie die zip-Funktion in Haskell ist.
Ich übergebe x Listen und bekomme eine Liste aus x-Tupeln herraus.
Besipiel:
Code: Alles auswählen
L1=["a","b","c"]
L2=[1,2,3]
Ergebniss= [("a",1),("b",2),("c",3)]
und das ergebniss würde ich dann gerne sortieren, und wenn es geht nach _einem der tupel-werte, also zum beispiel nach den zahlen.
gibt es da in Python schon fertige funktionen, oder muss ich mir das selber schreiben?
Danke,
robert
Re: 2 Listen "Reisverschluß-artig" verknüpfen
Verfasst: Mittwoch 25. April 2007, 18:26
von gerold
.robert hat geschrieben:ähnlich wie die zip-Funktion
Hallo robert!
Willkommen im Python-Forum!
Du suchst also ``zip()``.
Code: Alles auswählen
>>> l1 = ["b", "a", "c"]
>>> l2 = [2, 3, 1]
>>> ergebnis = zip(l1, l2)
>>> ergebnis
[('b', 2), ('a', 3), ('c', 1)]
>>> sorted(ergebnis)
[('a', 3), ('b', 2), ('c', 1)]
>>> import operator
>>> sorted(ergebnis, key = operator.itemgetter(1))
[('c', 1), ('b', 2), ('a', 3)]
>>>
mfg
Gerold
PS: Diese Seite könnte bei so einer Suche nach einer Funktion behilflich sein:
http://docs.python.org/lib/genindex.html
Verfasst: Mittwoch 25. April 2007, 18:37
von .robert
wow, schnell und freundlich die antwort, danke!
aber das die funktion jetzt auch noch genau so heißt ist ja schon ein bischen peinlich
Aber hat schonmal einer nach "zip" gegoogelt
grüße...
Verfasst: Mittwoch 25. April 2007, 19:22
von EyDu
.robert hat geschrieben:Aber hat schonmal einer nach "zip" gegoogelt
Also oft steht in der Doku auch schon genug
Re: 2 Listen "Reisverschluß-artig" verknüpfen
Verfasst: Mittwoch 25. April 2007, 20:11
von Zap
Code: Alles auswählen
>>> import operator
>>> sorted(ergebnis, key = operator.itemgetter(1))
Also wenn ich mal wieder mehr Zeit hab muss ich mir das mal im Debugger angucken. Hab das noch nicht 100% verstanden was da mit dem itemgetter-Objekt angestellt wird. Aber interessant zu wissen
Re: 2 Listen "Reisverschluß-artig" verknüpfen
Verfasst: Mittwoch 25. April 2007, 20:46
von gerold
Zap hat geschrieben:Code: Alles auswählen
>>> import operator
>>> sorted(ergebnis, key = operator.itemgetter(1))
Hi Zap!
Code: Alles auswählen
>>> sorted(ergebnis, key = lambda x: x[1])
[('c', 1), ('b', 2), ('a', 3)]
>>> def keyfunc(x):
... return x[1]
...
>>> sorted(ergebnis, key = keyfunc)
[('c', 1), ('b', 2), ('a', 3)]
>>>
Als ``key`` kann eine Funktion übergeben werden. Diese Funktion wird beim Iterieren über das zu sortierende Objekt für jedes enthaltene Item einmal aufgerufen.
Ich gehe davon aus, dass ``operator.itemgetter`` schneller als ``lambda`` oder eine selbst geschriebene Funktion ist, da ``operator`` ein eingebautes, wahrscheinlich in C geschriebenes, Modul ist. -->
Code: Alles auswählen
>>> help(operator.itemgetter)
Help on class itemgetter in module operator:
class itemgetter(__builtin__.object)
| itemgetter(item) --> itemgetter object
|
| Return a callable object that fetches the given item from its operand.
| After, f=itemgetter(2), the call f(b) returns b[2].
mfg
Gerold
Verfasst: Mittwoch 25. April 2007, 22:25
von Zap
Super danke, das hab ich jetzt gerafft.
Re: 2 Listen "Reisverschluß-artig" verknüpfen
Verfasst: Donnerstag 26. April 2007, 08:05
von jens
gerold hat geschrieben:Du suchst also ``zip()``.
Ich habs mal ins Wiki eingetragen: [wiki]Tutorial/Listen#ZipZweiListenVerknpfen[/wiki]
Verfasst: Donnerstag 26. April 2007, 08:50
von BlackJack
Ich wollte nochmal `itertools.izip()` in die Runde werfen. Damit bekommt man ein wenig "lazy evaluation" wie bei Haskell's `zip`.