Hier ist eine Häufigkeitstabelle, die als Liste implementiert ist.Entsperren der Häufigkeitstabelle nach Listenverständnis
table = [1,3,2]
Die gewünschte Ausgabe ist eine Liste der einzelnen Werte.
unspooled = [0, 1, 1, 1, 2, 2]
Die folgende Syntax wird die Arbeit erledigen.
sum((freq*[score] for score, freq in enumerate(table)), [])
Als Übung meines Verständnis zu testen, würde ich aber gerne wissen, ob es eine Möglichkeit, ist das mit Verständnis reiner Liste zu erreichen. Vielen Dank.
(oder sekundär, ob es ein Weg, es zu tun, dass ausdrucksstärker als das, was ich habe, dass das Verständnis nicht reine Liste ist, bin ich zu, dass offen, auch.)
PS Anscheinend meine Syntax ergibt terrible performance.
Aktualisierung. Timings aller vorgeschlagenen Lösungen.
In [9]: table
Out[9]: range(0, 1000)
In [10]: %timeit [i for i, x in enumerate(table) for _ in range(x)]
10 loops, best of 3: 27.1 ms per loop
In [11]: %timeit [ind for ind in range(len(table)) for val in range(table[ind])]
10 loops, best of 3: 27 ms per loop
In [12]: %timeit reduce(lambda x,y:x+y, [ [i]*frq for i,frq in enumerate(table)])
1 loop, best of 3: 1.11 s per loop
In [13]: %timeit list(itertools.chain(freq*[score] for score, freq in enumerate(table))
100 loops, best of 3: 3.84 ms per loop
Wow, das ist viel weniger ausdrucksvoll als Was ich habe. Es funktioniert, aber ehrlich gesagt, ich habe keine Ahnung warum. Wann und wie wird 'val' verwendet? – bongbang
Ich sehe jetzt. 'val' wird nicht benutzt. Es ist nur ein Wegweiser, um die Schleife zu durchlaufen, die auf "ind" läuft. – bongbang