2016-07-14 6 views
0

다음은 목록으로 구현 된 빈도 테이블입니다.목록 이해력 별 빈도 테이블 비 풀림

table = [1,3,2] 

원하는 출력은 개별 값 목록입니다.

unspooled = [0, 1, 1, 1, 2, 2] 

다음 구문을 사용하면 작업이 완료됩니다.

sum((freq*[score] for score, freq in enumerate(table)), []) 

그러나 내 이해를 테스트하기위한 연습으로 순수한 목록 이해로이를 수행 할 수있는 방법이 있는지 알고 싶습니다. 고맙습니다.

(I 그 순수 지능형리스트없는이 것보다 더 많은 표현입니다 그것을 할 수있는 방법이 있는지 또는 이차적으로는, 나도 그에게 열려 있어요.)

PS 분명히, 내 구문 수율은 terrible performance이다.

업데이트. 제안 된 모든 솔루션의 타이밍입니다.

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 

답변

2

나는이 일을 할 생각 :

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

와우, 즉보다 훨씬 덜 표현입니다 내가 가진거야. 그것은 효과가 있지만 솔직히, 나는 이유를 모른다. 'val'은 언제 어떻게 사용 되나요? – bongbang

+0

지금 봅니다. 'val'은 사용되지 않습니다. 'ind '에서 작동하는 루프를 얻는 것은 그냥 쓰레기입니다. – bongbang

2

당신은 table에서 인덱스 및 항목을 반환하는 enumerate를 사용할 수 있습니다

>>> 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] 
관련 문제