2017-10-30 2 views
1

나는 다음과 같은 텍스트 파일이 있습니다파이썬 - 텍스트 파일에서 키 값 쌍을 계산

abstract 233:1 253:1 329:2 1087:2 1272:1 
game 64:1 99:1 206:1 595:1 
direct 50:1 69:1 1100:1 1765:1 2147:1 3160:1 

각 키 쌍은 각 문자열이 문서 [수있는 ID]에 표시되는 횟수입니다 : [stringFq]

이 텍스트 파일에서 키 쌍의 수를 어떻게 계산할 수 있습니까?

+3

컴퓨터를 끄고 종이와 연필을 준비하는 것이 좋습니다. 단어 **로 설명하십시오 ** 어떻게이 문제를 손으로 해결할 수 있을까요? 파이썬 구문에 대해 걱정하지 마십시오.솔루션에 필요한 단계 만 작성하면됩니다. –

답변

1

정규식 접근 방식이 정상적으로 작동합니다. 다음은 반복적 인 접근법입니다. 인쇄 문을 주석 처리를 제거하면 몇 가지 결과가 나타납니다.

%%file foo.txt 
abstract 233:1 253:1 329:2 1087:2 1272:1 
game 64:1 99:1 206:1 595:1 
direct 50:1 69:1 1100:1 1765:1 2147:1 3160:1 

코드

import itertools as it 


with open("foo.txt") as f:         
    lines = f.readlines() 
    #print(lines) 
    pred = lambda x: x.isalpha()       

    count = 0            
    for line in lines: 
     line = line.strip("\n") 
     line = "".join(it.dropwhile(pred, line)) 
     pairs = line.strip().split(" ") 
     #print(pairs) 
     count += len(pairs) 

count 
# 15 

세부

먼저 우리는,164,619,132 사용 감안할 10 문은 안전하게 파일을 열고 닫는 관용구입니다. 그런 다음 파일을 readlines()을 통해 줄 바꿈합니다. 우리는 나중에 사용할 조건부 함수 (또는 술어)를 정의합니다. 람다 표현은 편의를 사용하고 다음의 함수에 상당한다 :

def pred(x): 
    return x.isaplha() 

우리가 count 변수를 초기화하고 반복하는 각 행을 시작한다. 모든 줄에는 줄 바꿈 문자 \n이있을 수 있으므로 먼저 줄을 dropwhile으로 보내기 전에 먼저 strip() 문자를 빼십시오.

dropwhile은 특별한 itertools 반복기입니다. 행을 반복 할 때, 술어를 만족시키는 선행 문자는 술어에 실패한 첫 x 째. 자에 도달 할 때까지 v립니다. 다른 말로하면, 시작 부분의 모든 문자는 첫 번째 비 문자가 발견 될 때까지 삭제됩니다 (이 경우는 공백 임). 우리는 새 줄을 다시 청소하고 선행 공백을 제거하고 나머지 문자열은 이고 목록은 pairs입니다.

마지막으로 각 쌍의 줄 길이는 count에 점진적으로 추가됩니다. 최종 계수는 모든 길이의 합계가 pairs입니다.

  • 각각을 반복하면서
  • 선에 파일
  • 분할 파일을 열 수 :

    요약

    위의 코드는 단순 반복 단계 처리 기본 파일을 해결하는 방법을 보여준다 라인, 청소 및 프로세스 데이터

  • 결과 출력
+0

답변 해 주셔서 감사합니다. 파이썬에 익숙하지 않으므로 이것은 매우 조형 적입니다! – kieron

+0

문제 없습니다. 이것은 이것을 행하는 많은 방법 중 하나입니다. – pylang

0
import re 


file = open('input.txt', 'r') 
file = file.read() 
numbers = re.findall(r"[-+]?\d*\.\d+|\d+", file) 
#finds all ints from text file 
numLen = len(numbers)/2 
#counts all ints, when I needed to count pairs, so I just divided it by 2 

print(numLen) 
+0

답변에 설명을 추가해야합니다. 코드뿐만 아니라 코드 및 설명 문제를 해결하십시오. –

+0

코드에 몇 가지 설명을 추가했습니다 – kieron

+0

정규 표현식은이를 수행하는 차선책입니다. 공백 문자에서 문자열 분할을 사용하여 더 쉽고 더 읽기 쉽게이 결과를 얻은 다음 '1'을 뺍니다 (분할 문자열의 첫 번째 항목이 항상 단어라고 가정). – Jules

관련 문제