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 :oops:
Aber hat schonmal einer nach "zip" gegoogelt :wink:

grüße...

Verfasst: Mittwoch 25. April 2007, 19:22
von EyDu
.robert hat geschrieben:Aber hat schonmal einer nach "zip" gegoogelt :wink:
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

>>> operator
<module 'operator' (built-in)>

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. :o

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`.