Listen kombinieren

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.
Antworten
nemomuk
User
Beiträge: 862
Registriert: Dienstag 6. November 2007, 21:49

Dienstag 29. Juli 2008, 21:23

Hallo,

stehe gerade auf dem Schlauch...

Wie kann ich aus folgendem:

Code: Alles auswählen

>>> a = ["a" for x in range(5)]
>>> b = ["b" for x in range(5)]
>>> a
['a', 'a', 'a', 'a', 'a']
>>> b
['b', 'b', 'b', 'b', 'b']
Folgendes machen?
['a','b','a','b']

Danke!
Benutzeravatar
birkenfeld
Python-Forum Veteran
Beiträge: 1603
Registriert: Montag 20. März 2006, 15:29
Wohnort: Die aufstrebende Universitätsstadt bei München

Dienstag 29. Juli 2008, 21:50

Warum gerade 2-mal "a" und "b"?
Dann lieber noch Vim 7 als Windows 7.

http://pythonic.pocoo.org/
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

Dienstag 29. Juli 2008, 22:00

Da gibt es viiiiele Möglichkeiten. Zum Beispiel diese:

Code: Alles auswählen

>>> a = ['a' for x in range(5)]
>>> b = ['b' for x in range(5)]
>>> c = []
>>> for pair in map(None,a,b):
...     c.extend(list(pair))
...
>>> c
['a', 'b', 'a', 'b', 'a', 'b', 'a', 'b', 'a', 'b']
Darii
User
Beiträge: 1177
Registriert: Donnerstag 29. November 2007, 17:02

Dienstag 29. Juli 2008, 22:01

Oder so:

Code: Alles auswählen

In [1]: from itertools import izip 

In [2]: def flatzip(a, b): 
   ...:     for item in izip(a, b): 
   ...:         yield item[0] 
   ...:         yield item[1] 
   ...: 

In [3]: a = list("a"*5) 

In [4]: b = list("b"*5) 

In [5]: list(flatzip(a, b))

Out[5]: ['a', 'b', 'a', 'b', 'a', 'b', 'a', 'b', 'a', 'b']
Benutzeravatar
BlackVivi
User
Beiträge: 762
Registriert: Samstag 9. Dezember 2006, 14:29
Kontaktdaten:

Dienstag 29. Juli 2008, 22:06

Darii hat geschrieben:Oder so:

Code: Alles auswählen

from itertools import izip
def flatzip(a, b):
    for item in izip(a, b):
        yield item[0]
        yield item[1]

a = list("a"*5)
b = list("b"*5)
print list(flatzip(a, b))
Oder mit beliebig vielen:

Code: Alles auswählen

from itertools import izip

def flatzip(*args):
    for item in izip(*args):
        for i in item:
            yield i
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

Dienstag 29. Juli 2008, 22:10

Oder - leicht modifiziert - so:

Code: Alles auswählen

>>> a, b, c = ['a']*5, ['b']*5, []
>>> for pair in zip(a,b): c.extend(list(pair))
...
>>> c
['a', 'b', 'a', 'b', 'a', 'b', 'a', 'b', 'a', 'b']
Benutzeravatar
Craven
User
Beiträge: 223
Registriert: Dienstag 24. Januar 2006, 13:37

Dienstag 29. Juli 2008, 23:00

Edit: Was schreib ich eigentlich. ;)
[code]q = 'q = %s; print q %% repr(q)'; print q % repr(q) [/code]
EyDu
User
Beiträge: 4871
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Dienstag 29. Juli 2008, 23:13

Das Problem möchte auch noch funktional gelöst werden:

Code: Alles auswählen

>>> a = ["a"]*5
>>> b = ["b"]*5
>>> list(reduce(tuple.__add__, zip(a, b)))
['a', 'b', 'a', 'b', 'a', 'b', 'a', 'b', 'a', 'b']
nemomuk
User
Beiträge: 862
Registriert: Dienstag 6. November 2007, 21:49

Mittwoch 30. Juli 2008, 05:16

Da kann ich mir ja jetzt die schönste ruassuchen^^ Ich hatte nur gedacht, es gibt eine vorgefertigte Funktion wie zip, die das automatisch macht.

Vielen Dank!
bughunter
User
Beiträge: 19
Registriert: Montag 28. Juli 2008, 13:51

Mittwoch 30. Juli 2008, 07:42

hier noch eine Möglichkeit - Indizes (i) wollen auch mal benutzt werden :D

Code: Alles auswählen

c = list()
for i in range(0, len(a)):
	c.append(a[i])
	c.append(b[i])

>>> c
['a', 'b', 'a', 'b', 'a', 'b', 'a', 'b', 'a', 'b']


Fast schon ein "99 Bottles of Beer" der Thread hier :wink:
(http://99-bottles-of-beer.net)

Gruß
bughunter
Benutzeravatar
wuf
User
Beiträge: 1483
Registriert: Sonntag 8. Juni 2003, 09:50

Mittwoch 30. Juli 2008, 13:14

Eine weitere Variante

Code: Alles auswählen

>>> a = ['a']*5
>>> b = ['b']*5
>>> c = []
>>> for i in xrange(len(a)):
	c += a[i]
	c += b[i]

	
>>> c
['a', 'b', 'a', 'b', 'a', 'b', 'a', 'b', 'a', 'b']
Und wenn es nur um Inhalt der beiden Listen a und b, welche diesen Tread auslösten ginge, warum nicht einfach:

Code: Alles auswählen

c = ['a','b']*5
>>> c
['a', 'b', 'a', 'b', 'a', 'b', 'a', 'b', 'a', 'b']
Gruss wuf :wink:
Take it easy Mates!
Antworten