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

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

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

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

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:

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

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

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

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

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

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: 1529
Registriert: Sonntag 8. Juni 2003, 09:50

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