복붙노트

[PYTHON] 파이썬에서 길이 인코딩 실행

PYTHON

파이썬에서 길이 인코딩 실행

이 문제를 해결하기 위해 간단한 파이썬 알고리즘을 작성하려고합니다. 내 코드가 작동하지 않는 이유를 알아내는 데 도움주세요 :

문제:

내 코드 :

def runLengthEncode (plainText):
    res=''
    a=''
    for i in plainText:
        if a.count(i)>0:
            a+=i
        else:
            if len(a)>4:
                res+="/" + str(len(a)) + a[0][:1]
            else:
                res+=a
                a=i
    return(res)

해결법

  1. ==============================

    1.문자열을 인쇄 할 때 시퀀스를 인코딩하고 int에 너비를 설정 한 후 a = i를 설정하는 것 외에도. 당신은 또한 pythons groupby를 이용하는 다음을 할 수 있습니다. 문자열을 만들 때 형식을 사용하는 것도 좋은 생각입니다.

    문자열을 인쇄 할 때 시퀀스를 인코딩하고 int에 너비를 설정 한 후 a = i를 설정하는 것 외에도. 당신은 또한 pythons groupby를 이용하는 다음을 할 수 있습니다. 문자열을 만들 때 형식을 사용하는 것도 좋은 생각입니다.

    from itertools import groupby
    
    def runLengthEncode (plainText):
        res = []
    
        for k,i in groupby(plainText):
            run = list(i)
            if(len(run) > 4):
                res.append("/{:02}{}".format(len(run), k))
            else:
                res.extend(run)
    
        return "".join(res)
    
  2. ==============================

    2.행동을 관찰하면됩니다.

    행동을 관찰하면됩니다.

    >>> runLengthEncode("abcd")
    'abc'
    

    마지막 문자는 무시됩니다. 수집 한 것을 추가해야합니다.

    >>> runLengthEncode("abbbbbcd")
    'a/5b/5b'
    

    인코딩 후 문제가 발생합니다. 충분히 긴 시퀀스를 찾았 으면 a = i로 설정해야합니다.

  3. ==============================

    3.Rosetta Code에는 많은 구현이있어 사용하기 쉬운 환경에 쉽게 적용 할 수 있어야합니다.

    Rosetta Code에는 많은 구현이있어 사용하기 쉬운 환경에 쉽게 적용 할 수 있어야합니다.

    다음은 정규식이있는 Python 코드입니다.

    from re import sub
    
    def encode(text):
        '''
        Doctest:
            >>> encode('WWWWWWWWWWWWBWWWWWWWWWWWWBBBWWWWWWWWWWWWWWWWWWWWWWWWBWWWWWWWWWWWWWW')
            '12W1B12W3B24W1B14W'    
        '''
        return sub(r'(.)\1*', lambda m: str(len(m.group(0))) + m.group(1),
                   text)
    
    def decode(text):
        '''
        Doctest:
            >>> decode('12W1B12W3B24W1B14W')
            'WWWWWWWWWWWWBWWWWWWWWWWWWBBBWWWWWWWWWWWWWWWWWWWWWWWWBWWWWWWWWWWWWWW'
        '''
        return sub(r'(\d+)(\D)', lambda m: m.group(2) * int(m.group(1)),
                   text)
    
    textin = "WWWWWWWWWWWWBWWWWWWWWWWWWBBBWWWWWWWWWWWWWWWWWWWWWWWWBWWWWWWWWWWWWWW"
    assert decode(encode(textin)) == textin
    
  4. ==============================

    4.목록 / 생성기 이해와 결합 된 groupby () 함수를 사용할 수 있습니다.

    목록 / 생성기 이해와 결합 된 groupby () 함수를 사용할 수 있습니다.

    from itertools import groupby, imap
    
    ''.join(x if reps <= 4 else "/%02d%s" % (reps, x) for x, reps in imap(lambda x: (x[0], len(list(x[1]))), groupby(s)))
    
  5. ==============================

    5.이것이 가장 효율적인 해결책은 아니라는 것을 알고 있지만 groupby ()와 같은 함수를 연구하지는 못했습니다. 그래서 여기에 제가 한 일이 있습니다 :

    이것이 가장 효율적인 해결책은 아니라는 것을 알고 있지만 groupby ()와 같은 함수를 연구하지는 못했습니다. 그래서 여기에 제가 한 일이 있습니다 :

    def runLengthEncode (plainText):
        res=''
        a=''
        count = 0
        for i in plainText:
            count+=1
            if a.count(i)>0:
                a+=i
            else:
                if len(a)>4:
                    if len(a)<10:
                        res+="/0"+str(len(a))+a[0][:1]
                    else:
                        res+="/" + str(len(a)) + a[0][:1]
                    a=i
                else:
                    res+=a
                    a=i
            if count == len(plainText):
                if len(a)>4:
                    if len(a)<10:
                        res+="/0"+str(len(a))+a[0][:1]
                    else:
                        res+="/" + str(len(a)) + a[0][:1]
                else:
                    res+=a
        return(res)
    
  6. ==============================

    6.내가 생각할 수있는 런 - 렝쓰 인코딩에 대한 쉬운 솔루션 :

    내가 생각할 수있는 런 - 렝쓰 인코딩에 대한 쉬운 솔루션 :

    "a4b5c6d7 ..."과 같은 문자열을 인코딩하는 경우

    def encode(s):
        counts = {}
        for c in s:
            if counts.get(c) is None:
                counts[c] = s.count(c)
        return "".join(k+str(v) for k,v in counts.items())
    

    "aaaaaabbbdddddccccc ...."와 같은 문자열을 디코딩하려면 :

    def decode(s):
        return "".join((map(lambda tup:  tup[0] * int(tup[1]), zip(s[0:len(s):2], s[1:len(s):2]))))
    

    읽기 쉽고 간단합니다.

  7. ==============================

    7.

    text=input("please enter the string to encode")
    encoded=[]
    index=0
    amount=1
    while index<=(len(text)-1):  
      if index+1==len(text):
        encoded.append(text[index])
        encoded.append(amount)
      elif text[index]==text[(index+1)]:
        amount=amount+1           
      else:
        encoded.append(text[index])
        encoded.append(amount)
        amount=1
      index=index+1   
    print(encoded)
    

    이것은 가장 간단한 방법 (가장 간단한 방법을 사용하여) 내가 해결책을 찾았지만, 더 효율적일 수 있다는 것을 깨달았습니다.

  8. from https://stackoverflow.com/questions/18948382/run-length-encoding-in-python by cc-by-sa and MIT license