Seite 1 von 1

Vervielfachen von Listenelementen

Verfasst: Mittwoch 25. Oktober 2006, 10:21
von Nirven
Hi,

ich habe ein irgendwie triviales Problem. Ich bekomme eine Liste

Code: Alles auswählen

start = [1,2,3]
Daraus soll dann

Code: Alles auswählen

[1,1,1,2,2,2,3,3,3]
werden.

Gibt es da eine bessere Möglichkeit als das:

Code: Alles auswählen

ziel = []
for i in start:
    ziel.append(i)
    ziel.append(i)
    ziel.append(i)
Da ich das ganze mit 16 mal machen will (aus der Ergebnisliste wird ein Bild, bei dem immer Felder von 16*16 Pixel den gleichen Wert haben sollen) erscheint mir die obige Methode etwas unschön...

Ich hoffe, jemand kann mitr eine 'schönere' Möglichkeit empfehlen.

Sören

Verfasst: Mittwoch 25. Oktober 2006, 10:27
von murph
der code sagt alles^^:

Code: Alles auswählen

>>> a = [1,2,3] * 3
>>> a
[1, 2, 3, 1, 2, 3, 1, 2, 3]
>>> a.sort()
>>> a
[1, 1, 1, 2, 2, 2, 3, 3, 3]
>>>


Verfasst: Mittwoch 25. Oktober 2006, 10:43
von BlackJack
Als Einzeiler:

Code: Alles auswählen

reduce(operator.add, ([i] * 3 for i in [1, 2, 3]))
Allerdings könnte man auch eine etwas lesbarere Funktion schreiben:

Code: Alles auswählen

def iduplicate(iterable, count):
    for item in iterable:
        for dummy in xrange(count):
            yield item

def main():
    print list(iduplicate([1, 2, 3], 3))

Verfasst: Mittwoch 25. Oktober 2006, 11:23
von Rebecca
murph hat geschrieben:

Code: Alles auswählen

>>> a = [1,2,3] * 3
>>> a
[1, 2, 3, 1, 2, 3, 1, 2, 3]
>>> a.sort()
>>> a
[1, 1, 1, 2, 2, 2, 3, 3, 3]
>>>
Das ist hoechstwahrscheinlich nicht das, was Nirven will. Was ist mit [1, 2, 3, 1] oder [3, 1, 2]?

Verfasst: Mittwoch 25. Oktober 2006, 11:37
von Nirven
Ja, Rebecca hat recht. War wohl ein schlechtes Beispiel.

Die Liste muss in der ursprünglichen Reihenfolge bleiben und wird nicht sortiert sein, also kann es auch [87,5,231] geben, woraus [87,87,87,5,5,5,231,231,231] werden soll.

Verfasst: Mittwoch 25. Oktober 2006, 12:48
von Zap
Also auf die Schnelle hätte ich nur so etwas

Code: Alles auswählen

>>> [3 * [i] for i in [87,5,231]]
[[87, 87, 87], [5, 5, 5], [231, 231, 231]]
Dann müsste man nur wieder die äußere Liste zusammenfassen.
Einfach for schleife ist zu easy. Weiß aber gerade noch nicht wie es besser geht :)
Bin noch nicht lange genug dabei. Aber vielleicht reicht dir das ja auch schon
Oder jemand anders kann es ergänzen.

Edit: Ups ich sehe gerade BlackJack hat da schon so eine Lösung. Sorry :oops:
reduce(operator.add, ( * 3 for i in [1, 2, 3]))

Allerdings funktioniert die bei mir nicht. Muss man da noch was importieren? operator gibts bei mir , aber reduce nicht.

Verfasst: Mittwoch 25. Oktober 2006, 13:06
von Nirven
Jo Zap, ich habe jetzt ersteinmal eine for-Schleife eingebaut. Dafür sind sie ja irgendwie da, aber ich dachte es gibt eine "vorgesehene" Art, soetwas mit Listen (oder von mir aus auch Arrays) zu machen.

Reduce war bei mir kein Problem, aber es hat etwas gedauert bis ich einfach mal in die Python-Hilfe geguckt habe und das Modul "operator" fand. Jetzt probioer ich BlackJacks Vorschlag mal aus.

Danke für die Antworten :)

Verfasst: Mittwoch 25. Oktober 2006, 13:16
von Zap
Ach, da war ein Klammerfehler drin.

nu gehts bei mir auch. Und es kommt auch das richtige raus.
Wieder was gelernt :)

Code: Alles auswählen

>>> reduce(operator.add, [ [i] * 3 for i in [87,5,231] ])
[87, 87, 87, 5, 5, 5, 231, 231, 231]