[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.문자열을 인쇄 할 때 시퀀스를 인코딩하고 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.행동을 관찰하면됩니다.
행동을 관찰하면됩니다.
>>> runLengthEncode("abcd") 'abc'
마지막 문자는 무시됩니다. 수집 한 것을 추가해야합니다.
>>> runLengthEncode("abbbbbcd") 'a/5b/5b'
인코딩 후 문제가 발생합니다. 충분히 긴 시퀀스를 찾았 으면 a = i로 설정해야합니다.
-
==============================
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.목록 / 생성기 이해와 결합 된 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.이것이 가장 효율적인 해결책은 아니라는 것을 알고 있지만 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.내가 생각할 수있는 런 - 렝쓰 인코딩에 대한 쉬운 솔루션 :
내가 생각할 수있는 런 - 렝쓰 인코딩에 대한 쉬운 솔루션 :
"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.
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)
이것은 가장 간단한 방법 (가장 간단한 방법을 사용하여) 내가 해결책을 찾았지만, 더 효율적일 수 있다는 것을 깨달았습니다.
from https://stackoverflow.com/questions/18948382/run-length-encoding-in-python by cc-by-sa and MIT license
'PYTHON' 카테고리의 다른 글
[PYTHON] 텍스트 파일에서 numpy 배열로 데이터 읽기 (0) | 2018.11.25 |
---|---|
[PYTHON] iterable을 스트림으로 변환하는 방법? (0) | 2018.11.25 |
[PYTHON] 장고 관리자의 종속 인라인의 유효성 검사 (0) | 2018.11.25 |
[PYTHON] 숫자를 고정 길이로 이진으로 변환 (0) | 2018.11.25 |
[PYTHON] 파이썬 3.2 람다 구문 오류 [중복] (0) | 2018.11.25 |