같은 문자 블록을 가진 문자열이 있습니다 (예 : '1254 ,,,,,,,,,,,,,,,, 982'). 내가하고자하는 것은 '1254 (, 16) 982'행을 따라 원래의 문자열을 재구성 할 수 있도록 바꾸는 것입니다. 누구든지 올바른 방향으로 나를 가리킬 수 있다면 크게 환영 할 것입니다.파이썬에서 중복을 제거하여 압축하는 방법은 무엇입니까?
답변
run-length encoding을 찾고 있습니다. 여기에 this one에 기반한 Python 구현이 있습니다. 귀하의 예를 들어
import itertools
def runlength_enc(s):
'''Return a run-length encoded version of the string'''
enc = ((x, sum(1 for _ in gp)) for x, gp in itertools.groupby(s))
removed_1s = [((c, n) if n > 1 else c) for c, n in enc]
joined = [["".join(g)] if n == 1 else list(g)
for n, g in itertools.groupby(removed_1s, key=len)]
return list(itertools.chain(*joined))
def runlength_decode(enc):
return "".join((c[0] * c[1] if len(c) == 2 else c) for c in enc)
:
print runlength_enc("1254,,,,,,,,,,,,,,,,982")
# ['1254', (',', 16), '982']
print runlength_decode(runlength_enc("1254,,,,,,,,,,,,,,,,982"))
# 1254,,,,,,,,,,,,,,,,982
(당신의 문자열에 매우 긴 실행이있는 경우에만이 효율적 않습니다).
정확한 압축 형식에 신경 쓰지 않는다면 zlib.compress
및 zlib.decompress
을 참조하십시오. zlib
은 단일 문자열을 압축 할 수있는 Python 라이브러리로 자체 구현 압축 알고리즘보다 압축률이 높습니다.
+1 이것은 매우 사실입니다. –
zlib는 치아가 길어지고 있습니다. bz2는 빈번하게 압축되고 표준 라이브러리에 있습니다. xz/lzma가 붙잡고 있지만 Python 3.3까지는 표준 라이브러리를 만들지 못했다고 생각합니다. 그러나 구형 Python의 경우 타사 라이브러리로 사용할 수 있습니다. – user1277476
사용하여 정규 표현식 :
s = '1254,,,,,,,,,,,,,,,,982'
import re
c = re.sub(r'(.)\1+', lambda m: '(%s%d)' % (m.group(1), len(m.group(0))), s)
print C# 1254(,16)982
itertools에게
import itertools
c = ''
for chr, g in itertools.groupby(s):
k = len(list(g))
c += chr if k == 1 else '(%s%d)' % (chr, k)
print C# 1254(,16)982
- 1. 파이썬에서 중복을 확인하는 가장 빠른 방법은 무엇입니까?
- 2. 파이썬에서 바이너리 데이터를 파일로 효율적으로 압축하는 방법은 무엇입니까?
- 3. 파이썬에서 내 목록의 개별 값을 가진 키를 압축하는 방법은 무엇입니까?
- 4. UIImage를 압축하는 방법은 무엇입니까?
- 5. 중복을 제거하는 방법은 무엇입니까?
- 6. PHP로 JSON을 압축하는 방법은 무엇입니까?
- 7. XML 파일을 압축하는 방법은 무엇입니까?
- 8. Blackberry에서 파일을 압축하는 방법은 무엇입니까?
- 9. 병합 모듈을 압축하는 방법은 무엇입니까?
- 10. FSharp에서 파일을 압축하는 방법은 무엇입니까?
- 11. Xcode 프로젝트를 압축하는 방법은 무엇입니까?
- 12. ASPX 페이지를 압축하는 방법은 무엇입니까?
- 13. ASP에서 JSON을 압축하는 방법은 무엇입니까?
- 14. 중복을 제거하여 왼쪽 조인 쿼리 후 데이터를 가져 오는 중입니까?
- 15. 모든 중복을 제거하여 데이터 프레임에 NONE이 남아 있지 않게하려면 어떻게합니까?
- 16. 배열에서 중복을 플래그하는 방법은 무엇입니까?
- 17. RowDefinition 중복을 피하는 방법은 무엇입니까?
- 18. 데이터베이스에서 중복을 처리하는 방법은 무엇입니까?
- 19. 스레드의 중복을 방지하는 방법은 무엇입니까?
- 20. 오라클에서 중복을 피하는 방법은 무엇입니까?
- 21. 줄 바꿈을 제거하여 파이썬에서 문자열을 검색하지만 문자열이 발견 된 정확한 줄을 반환하는 방법은 무엇입니까?
- 22. 날짜를 압축하는 가장 좋은 방법은 무엇입니까?
- 23. 안드로이드에서 파일을 RAR 형식으로 압축하는 방법은 무엇입니까?
- 24. Windows Mobile 3.5에서 파일을 압축하는 방법은 무엇입니까?
- 25. .NET을 사용하여 디렉토리를 압축하는 방법은 무엇입니까?
- 26. 정렬 된 단어 목록을 압축하는 방법은 무엇입니까?
- 27. C++에서 문자열을 압축하는 방법은 무엇입니까?
- 28. 회전 후 DailyLogFile을 압축하는 방법은 무엇입니까?
- 29. Java에서 객체 스트림을 압축하는 방법은 무엇입니까?
- 30. Qt에서 몇 파일을 압축하여 압축하는 방법은 무엇입니까?
를 사용하여 내가 보통의-homogonous 목록을 옹호하지 만,'가진 ('1', 1)'약간의 중복 때를 보인다 당신은 단지 '1'을 가질 수 있습니다. 난 당신이 꽤 쉽게 '['1254 ', (', ', 16),'982 ']'를 반환하도록 수정할 수있을 것 같아요. 메모리 사용량 및 디스크 사용량면에서 1 목록, 8 튜플, 8 문자열, 8 정수가있는 버전 대신 훨씬 효율적입니다 (1 목록, 1 튜플, 4 문자열, 1 int). – mgilson
@mgilson : 네 말이 맞아, 내가 바꿀거야. –
완벽한 답변, 충분히 감사 할 수 없습니다 –