2016-06-13 2 views
0

주어진 데이터 세트의 문자 수를 계산할 수있는 프로그램을 작성했습니다.이 데이터 세트는 >chrome으로 시작하고 긴 숫자 체인 (a,b,c,d at random)으로 시작됩니다. 데이터의 덩어리는 정확히 다음과 같이 : 나는 각 >chrome 뒤에 표시 문자의 수를 계산하려면특정 문자열로 시작하는 데이터 청크 반복

("\n" shows space in the command line): ">chrome0001"\n"abcdbadbcbdabdcbdbbbbadbcbbdab>chrome0011" \n"bbbbadbcbabdbaaaadbcbddcdda>chrome0111"\n" .... (the total number of ">chrome" is 10)."

.

>>chrome0001 a:4 b:6 c:10 d: 11

나는 프로그램이이 웹 사이트에 많은 질문과 답변을 작동하지만 붙어있어 공부 얻을 \n>chrome를 사용할 수 있는지에 대해 생각을 해 봤는데 단지를 파고 : 그리고 예상 출력이 같아야합니다 더 깊이 구멍을 내주세요. 아무도 도와 줄 수 없습니까?

+0

당신이 당신의 입력과 원하는 출력을 설명해주십시오 수 : 당신은 무거운 리프팅을 할 수있는 collections.Counter를 사용할 수 있습니까? – Brian

+0

예, 고마워요. 각> 크롬 태그와 태그 아래에 글자 수를 인쇄하고 싶습니다. 제가 알고 싶은 것은 크롬이 발생할 때마다 계산 과정을 반복하는 것입니다. –

+1

'

답변

1

이것은 비교적 직선적 인 구문 분석 문제입니다. 먼저 문자열을 chromeXYZ\n 비트로 분할하고 다음 문자열로 그룹화합니다. 우리는 정규 표현식으로 비교적 쉽게 할 수 있습니다 - 여기에 내가 제대로 입력을 이해한다면 작동 하나 :

>>> import re 
>>> s = ">chrome0001\nabcdbadbcbdabdcbdbbbbadbcbbdab>chrome0011\nbbbbadbcbabdbaaaadbcbddcdda>chrome0111\n" 
>>> re.findall(r'(>chrome\d+\n)([^>]+)', s) 
[('>chrome0001\n', 'abcdbadbcbdabdcbdbbbbadbcbbdab'), ('>chrome0011\n', 'bbbbadbcbabdbaaaadbcbddcdda')] 

는 정규 표현식 앞으로 직선 (적어도 지금까지 정규 표현식으로 ... 이동) :

  • (>chrome\d+\n) - "> 크롬"일부 번호, 줄 바꿈
  • ([^>]+) - 다음 > 또는 입력이 끝날 때까지 모든 문자와 일치합니다.

여기에서 하위 시퀀스의 문자 수를 계산하는 것은 매우 쉽습니다. 우리는 당신이 필요로 알아낼 수 있도록

>>> from collections import Counter 
>>> for chrome, alpha in re.findall(r'(>chrome\d+\n)([^>]+)', s): 
... print(chrome, Counter(alpha)) 
... 
('>chrome0001\n', Counter({'b': 14, 'd': 7, 'a': 5, 'c': 4})) 
('>chrome0011\n', Counter({'b': 10, 'a': 7, 'd': 7, 'c': 3})) 
+0

물론 파이썬에는 카운터 클래스가 있습니다! –

+0

@AaronTaggart - FWIW, python2.7까지 추가되지 않았습니다. (몇 년 전 이었지만 언어의 수명이 다되었습니다.) – mgilson

관련 문제