List erstellen

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
Morila
User
Beiträge: 8
Registriert: Freitag 4. März 2016, 11:30

Ich würde gerne eine liste der Länge X erstellen, die nur Nullen enthällt. An jeder y-ten stelle möge eine 1 stehen. Quasi so:

X=15
y=3
Code???
print (list)

[001001001001001]

Vielen Dank im voraus.
Euer morila
mutetella
User
Beiträge: 1695
Registriert: Donnerstag 5. März 2009, 17:10
Kontaktdaten:

Auch auf die Gefahr hin, dass ich hier 'ne Hausaufgabe löse… mich hat's in den Fingern gejuckt:

Code: Alles auswählen

In [24]: x, y = 15, 3

In [25]: [e + (0 if i % y else 1) for i, e in enumerate([0] * x, 1)]
Out[25]: [0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1]
Entspanne dich und wisse, dass es Zeit für alles gibt. (YogiTea Teebeutel Weisheit ;-) )
Morila
User
Beiträge: 8
Registriert: Freitag 4. März 2016, 11:30

Ne. Keine hausaufgabe. Den Zähler einer cnc fräse.
vielen dank. Es funktioniert
mutetella
User
Beiträge: 1695
Registriert: Donnerstag 5. März 2009, 17:10
Kontaktdaten:

Morila hat geschrieben:Den Zähler einer cnc fräse.
Sachen gibt's… :wink:
Entspanne dich und wisse, dass es Zeit für alles gibt. (YogiTea Teebeutel Weisheit ;-) )
Dav1d
User
Beiträge: 1437
Registriert: Donnerstag 30. Juli 2009, 12:03
Kontaktdaten:

`[0] * x` mit itertools.repeat ersetzen, die LC mit einer Generator Expression austauschen und dann funktioniert das Ganze auch für ziemlich große x.

Untested:

Code: Alles auswählen

gen = ((0 if i % y else 1) for i, _ in enumerate(repeat(0, x), 1))
the more they change the more they stay the same
Benutzeravatar
snafu
User
Beiträge: 6740
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Das mit dem Wiederholen der Null kann man sich komplett sparen, wenn man einfach `range()` benutzt:

Code: Alles auswählen

[(0 if i % y else 1) for i in range(1, x + 1)]
mutetella
User
Beiträge: 1695
Registriert: Donnerstag 5. März 2009, 17:10
Kontaktdaten:

@Dav1d & snafu
Geil… ← Sorry, aber das musste jetzt mal gesagt werden! :mrgreen:
Entspanne dich und wisse, dass es Zeit für alles gibt. (YogiTea Teebeutel Weisheit ;-) )
Benutzeravatar
bwbg
User
Beiträge: 407
Registriert: Mittwoch 23. Januar 2008, 13:35

Code-Obfuscation with generators and many (many) parenthesis :lol:

Code: Alles auswählen

beeper = lambda x: ((0 if i % x else 1) for i in itertools.count(1))
take = lambda n, xs: (e for _, e in zip(range(n), xs))
print(list(take(15, beeper(3))))
"Du bist der Messias! Und ich muss es wissen, denn ich bin schon einigen gefolgt!"
BlackJack

@bwbg: `take()` würde ich auf `itertools.islice()` aufbauen.
Benutzeravatar
snafu
User
Beiträge: 6740
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Eine andere Möglichkeit:

Code: Alles auswählen

from itertools import cycle, islice

islice(cycle([0] * (y - 1) + [1]), x)
mutetella
User
Beiträge: 1695
Registriert: Donnerstag 5. März 2009, 17:10
Kontaktdaten:

Ihr wollt' mich jetzt bloß ärgern… aber wenn ich groß bin, dann
zahl' ich euch das heim! :twisted:
Entspanne dich und wisse, dass es Zeit für alles gibt. (YogiTea Teebeutel Weisheit ;-) )
Dav1d
User
Beiträge: 1437
Registriert: Donnerstag 30. Juli 2009, 12:03
Kontaktdaten:

Hab auch noch eins, inspiriert von snafu:

Code: Alles auswählen

>>> list(chain.from_iterable(repeat([0] * (y - 1) + [1], x//y)))
[0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1]
Natürlich ist das mit der Division nicht optimal, also lieber die Lösung von snafu :wink: .
the more they change the more they stay the same
Dav1d
User
Beiträge: 1437
Registriert: Donnerstag 30. Juli 2009, 12:03
Kontaktdaten:

Noch eins!

Code: Alles auswählen

islice(chain.from_iterable(izip(*(([repeat(0)]*(y-1)) + [repeat(1)]))), x)
the more they change the more they stay the same
Benutzeravatar
bwbg
User
Beiträge: 407
Registriert: Mittwoch 23. Januar 2008, 13:35

BlackJack hat geschrieben:@bwbg: `take()` würde ich auf `itertools.islice()` aufbauen.
Nunja "aufbauen" wäre wohl eher ersetzen :roll:

Code: Alles auswählen

beeper = lambda x: ((0 if i % x else 1) for i in itertools.count(1))
print(list(itertools.islice(beeper(3), 0, 15)))
Dav1d hat geschrieben:Noch eins!

Code: Alles auswählen

islice(chain.from_iterable(izip(*(([repeat(0)]*(y-1)) + [repeat(1)]))), x)
Das kommt jetzt schon sehr nah an eine (un)mögliche Brainfuck-Lösung.

Ich bevorzuge persönlich die vollständige Generatorlösung. So kann man sehr lange fräsen ...
"Du bist der Messias! Und ich muss es wissen, denn ich bin schon einigen gefolgt!"
Dav1d
User
Beiträge: 1437
Registriert: Donnerstag 30. Juli 2009, 12:03
Kontaktdaten:

bwbg hat geschrieben:
Dav1d hat geschrieben:Noch eins!

Code: Alles auswählen

islice(chain.from_iterable(izip(*(([repeat(0)]*(y-1)) + [repeat(1)]))), x)
Das kommt jetzt schon sehr nah an eine (un)mögliche Brainfuck-Lösung.

Ich bevorzuge persönlich die vollständige Generatorlösung. So kann man sehr lange fräsen ...
Das ist im grunde das Gleiche wie die Lösung von snafu, man kann auch hier unendlich lange Fräsen, das einzige was ein Problem werden kann ist ein großes `y`.

z.B. y = 5: `islice(chain.from_iterable(izip(*[repeat(0), repeat(0), repeat(0), repeat(0), repeat(1)])), x)`

`x` kann beliebig groß sein.

(Eigentlich ist `[repeat(0), repeat(0), repeat(0), repeat(0), repeat(1)]` ein `tmp1 = repeat(0); [tmp1, tmp1, tmp1, tmp1, repeat(1)]`)
the more they change the more they stay the same
Benutzeravatar
miracle173
User
Beiträge: 127
Registriert: Samstag 6. Februar 2016, 00:28

Code: Alles auswählen

>>> x=15
>>> y=3
>>> ([0]*(y-1)+[1])*(x//y)+[0]*(x%y)
[0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1]
 
Der Teil +[0]*(x%y) ist in diesem speziellen Fall, wo y die Zahl x teilt, überflüssig.

Eine andere Möglichkeit wäre

Code: Alles auswählen

(([0]*(y-1)+[1])*-(-x//y))[:x]
-(-x//y) garantiert dass der Quotient aufgerundet wird. Allerdings wird hier von der erzeugten Liste mit [:x] nochmals eine Kopie erzeugt.
Antworten