Seite 1 von 1
List erstellen
Verfasst: Freitag 18. März 2016, 16:47
von Morila
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
Re: List erstellen
Verfasst: Freitag 18. März 2016, 17:21
von mutetella
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]
Re: List erstellen
Verfasst: Freitag 18. März 2016, 18:39
von Morila
Ne. Keine hausaufgabe. Den Zähler einer cnc fräse.
vielen dank. Es funktioniert
Re: List erstellen
Verfasst: Freitag 18. März 2016, 19:17
von mutetella
Morila hat geschrieben:Den Zähler einer cnc fräse.
Sachen gibt's…

Re: List erstellen
Verfasst: Freitag 18. März 2016, 19:50
von Dav1d
`[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))
Re: List erstellen
Verfasst: Freitag 18. März 2016, 19:57
von snafu
Das mit dem Wiederholen der Null kann man sich komplett sparen, wenn man einfach `range()` benutzt:
Re: List erstellen
Verfasst: Freitag 18. März 2016, 20:23
von mutetella
@Dav1d & snafu
Geil… ← Sorry, aber das musste jetzt mal gesagt werden!

Re: List erstellen
Verfasst: Freitag 18. März 2016, 21:26
von bwbg
Code-Obfuscation with generators and many (many) parenthesis
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))))
Re: List erstellen
Verfasst: Freitag 18. März 2016, 21:55
von BlackJack
@bwbg: `take()` würde ich auf `itertools.islice()` aufbauen.
Re: List erstellen
Verfasst: Freitag 18. März 2016, 22:05
von snafu
Eine andere Möglichkeit:
Code: Alles auswählen
from itertools import cycle, islice
islice(cycle([0] * (y - 1) + [1]), x)
Re: List erstellen
Verfasst: Freitag 18. März 2016, 22:15
von mutetella
Ihr wollt' mich jetzt bloß ärgern… aber wenn ich groß bin, dann
zahl' ich euch das heim!

Re: List erstellen
Verfasst: Freitag 18. März 2016, 23:20
von Dav1d
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

.
Re: List erstellen
Verfasst: Freitag 18. März 2016, 23:34
von Dav1d
Noch eins!
Code: Alles auswählen
islice(chain.from_iterable(izip(*(([repeat(0)]*(y-1)) + [repeat(1)]))), x)
Re: List erstellen
Verfasst: Freitag 18. März 2016, 23:38
von bwbg
BlackJack hat geschrieben:@bwbg: `take()` würde ich auf `itertools.islice()` aufbauen.
Nunja "aufbauen" wäre wohl eher ersetzen
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 ...
Re: List erstellen
Verfasst: Freitag 18. März 2016, 23:52
von Dav1d
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)]`)
Re: List erstellen
Verfasst: Sonntag 20. März 2016, 20:27
von miracle173
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
-(-x//y) garantiert dass der Quotient aufgerundet wird. Allerdings wird hier von der erzeugten Liste mit
[:x] nochmals eine Kopie erzeugt.