2013-03-22 2 views
0

배열을 압축 해제해야하며 시작할 위치가 확실하지 않습니다. 여기 파이썬에서 배열 압축 해제

B[1]B[2]A[]에 표시 얼마나 많은 배,

def main(): 
    # Test case for Decompress function 
    B = [6, 2, 7, 1, 3, 5, 1, 9, 2, 0] 
    A = Decompress(B) 
    print(A) 

난 당신이 패턴을 볼 수없는 경우이

A = [2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 5, 5, 5, 9, 0, 0] 

을 제공 할 함수의 입력 B[3]B[4]A[]에 몇 번 나타나는지 등입니다.

어떻게이 기능을 작성합니까? zip()itertools.chain.from_iterable

+1

은 무엇 "압축"않습니다 이러한 맥락에서 의미? 제 생각에 B [0]에서 시작하고 A에 6 "2"가 없다고 생각합니다 ... – Ben

+0

어떤 시도라도 했습니까? 그렇다면 우리와 공유하십시오. –

+0

나는 시도했지만 그것이 내가 원하는 것에 가깝지 않다. – chh

답변

1
def unencodeRLE(i): 
    i = list(i) #Copies the list to a new list, so the original one is not changed. 
    r = [] 

    while i: 
     count = i.pop(0) 
     n = i.pop(0) 
     r+= [n for _ in xrange(count)] 
    return r 
+0

팝은 무엇을 하는가? 나는 파이썬에 익숙하지 않다. – chh

+0

은 목록에서 마지막 요소를 제거하고 그것을 반환하거나, 매개 변수를 사용하여 특정 요소를 반환한다. – LtWorf

+0

및 그 이후에 밑줄이있는 이유는 무엇입니까? – chh

3

컴팩트 버전 :

from itertools import chain 

list(chain.from_iterable([v] * c for c, v in zip(*([iter(B)]*2)))) 

데모 :

>>> B = [6, 2, 7, 1, 3, 5, 1, 9, 2, 0] 
>>> from itertools import chain 
>>> list(chain.from_iterable([v] * c for c, v in zip(*([iter(B)]*2)))) 
[2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 5, 5, 5, 9, 0, 0] 

이 부셔 :

0,123,516 :

  • zip(*([iter(B)]*2)))쌍 값으로 계산

    >>> zip(*([iter(B)]*2)) 
    [(6, 2), (7, 1), (3, 5), (1, 9), (2, 0)] 
    

    입력 iterable에서 쌍을 가져 오는 것은 상당히 표준적인 Python 트릭입니다.

    >>> next([v] * c for c, v in zip(*([iter(B)]*2))) 
    [2, 2, 2, 2, 2, 2] 
    
  • chain.from_iterable 발전기의 발현에 의해 생성 된 다양한 목록을 소요하고 당신이 그들을 반복 할 수 있습니다 :

  • ([v] * c for c, v in zip(*([iter(B)]*2)))

    은 수와 값을 사용하고 값 반복 카운트 시간과 목록을 생성하는 발전기 표현이다 하나의 긴 목록 인 것처럼

  • list() 모두가 목록으로 돌아갑니다.

+0

Heh. 내 것은'list (chain.from_iterable ([y] * x는 x, y는 zip (* [iter (B)] * 2)))'; 한 가지 분명한 방법입니다. (나는 당신의 변수 이름을 선호한다.) [편집 : 이제 모든 것은 설명이 가능하다.] – DSM

0

하나 이상의 원 라이너

def decompress(vl): 
    return sum([vl[i] * [vl[i+1]] for i in xrange(0, len(vl), 2)], []) 
  1. 지능형리스트의 추출 및 언팩 페어 (쌍 시작 인덱스 통해 xrange(0, len(vl), 2) 반복, vl[i]vl[i+1] 반복 수이고 반복 할 것입니다.)

  2. sum()은 결과를 함께 결합합니다 ([]은 압축 해제 목록이 순차적으로 추가되는 초기 값임).

0

약간 더 빠른 해결책 (Python 2.7).3) :

A=list(chain.from_iterable([ B[i]*[B[i+1]] for i in xrange(0,len(B),2) ])) 

>>> timeit.Timer(
     setup='B=[6,2,7,1,3,5,1,9,2,0];from itertools import chain', 
     stmt='A=list(chain.from_iterable([ B[i]*[B[i+1]] for i in xrange(0,len(B),2) ]))').timeit(100000) 
0.22841787338256836 

가와 비교 :

>>> timeit.Timer(
     setup='B=[6,2,7,1,3,5,1,9,2,0];from itertools import chain', 
     stmt='A=list(chain.from_iterable([v] * c for c, v in zip(*([iter(B)]*2))))').timeit(100000) 
0.31104111671447754