Vervielfachen von Listenelementen

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.
Nirven
User
Beiträge: 130
Registriert: Mittwoch 10. Mai 2006, 08:18
Wohnort: Bremerhaven

Vervielfachen von Listenelementen

Beitragvon Nirven » Mittwoch 25. Oktober 2006, 10:21

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
murph
User
Beiträge: 622
Registriert: Freitag 14. April 2006, 19:23
Kontaktdaten:

Beitragvon murph » Mittwoch 25. Oktober 2006, 10:27

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]
>>>

BlackJack

Beitragvon BlackJack » Mittwoch 25. Oktober 2006, 10:43

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))
Benutzeravatar
Rebecca
User
Beiträge: 1662
Registriert: Freitag 3. Februar 2006, 12:28
Wohnort: DN, Heimat: HB
Kontaktdaten:

Beitragvon Rebecca » Mittwoch 25. Oktober 2006, 11:23

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]?
Nirven
User
Beiträge: 130
Registriert: Mittwoch 10. Mai 2006, 08:18
Wohnort: Bremerhaven

Beitragvon Nirven » Mittwoch 25. Oktober 2006, 11:37

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.
Zap
User
Beiträge: 533
Registriert: Freitag 13. Oktober 2006, 10:56

Beitragvon Zap » Mittwoch 25. Oktober 2006, 12:48

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, ([i] * 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.
Nirven
User
Beiträge: 130
Registriert: Mittwoch 10. Mai 2006, 08:18
Wohnort: Bremerhaven

Beitragvon Nirven » Mittwoch 25. Oktober 2006, 13:06

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 :)
Zap
User
Beiträge: 533
Registriert: Freitag 13. Oktober 2006, 10:56

Beitragvon Zap » Mittwoch 25. Oktober 2006, 13:16

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]

Wer ist online?

Mitglieder in diesem Forum: Bing [Bot]