2016-07-14 5 views
0

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 

Antwort

2

Ich glaube, das würde funktionieren:

unspooled = [ind for ind in range(len(table)) for val in range(table[ind])] 
+0

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

+0

Ich sehe jetzt. 'val' wird nicht benutzt. Es ist nur ein Wegweiser, um die Schleife zu durchlaufen, die auf "ind" läuft. – bongbang

2

Sie enumerate verwenden können, um den Index und Element aus table zurückzukehren:

>>> table = [1,3,2] 
>>> [i for i, x in enumerate(table) for _ in range(x)] 
[0, 1, 1, 1, 2, 2] 
0
table = [1,3,2] 
res = reduce(lambda x,y:x+y, [ [i]*frq for i,frq in enumerate(table)]) 

output: 
[0, 1, 1, 1, 2, 2]