Seite 1 von 1

Listen kombinieren

Verfasst: Dienstag 29. Juli 2008, 21:23
von nemomuk
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!

Verfasst: Dienstag 29. Juli 2008, 21:50
von birkenfeld
Warum gerade 2-mal "a" und "b"?

Verfasst: Dienstag 29. Juli 2008, 22:00
von numerix
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']

Verfasst: Dienstag 29. Juli 2008, 22:01
von Darii
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']

Verfasst: Dienstag 29. Juli 2008, 22:06
von BlackVivi
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

Verfasst: Dienstag 29. Juli 2008, 22:10
von numerix
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']

Verfasst: Dienstag 29. Juli 2008, 23:00
von Craven
Edit: Was schreib ich eigentlich. ;)

Verfasst: Dienstag 29. Juli 2008, 23:13
von EyDu
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']

Verfasst: Mittwoch 30. Juli 2008, 05:16
von nemomuk
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!

Verfasst: Mittwoch 30. Juli 2008, 07:42
von bughunter
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

Verfasst: Mittwoch 30. Juli 2008, 13:14
von wuf
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: