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… :wink:

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:

Code: Alles auswählen

[(0 if i % y else 1) for i in range(1, x + 1)]

Re: List erstellen

Verfasst: Freitag 18. März 2016, 20:23
von mutetella
@Dav1d & snafu
Geil… ← Sorry, aber das musste jetzt mal gesagt werden! :mrgreen:

Re: List erstellen

Verfasst: Freitag 18. März 2016, 21:26
von bwbg
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))))

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! :twisted:

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 :wink: .

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 :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 ...

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

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.