2013-10-04 2 views
0

내 질문에는 몇 가지 문제를 해결해야합니다. 두 필드 (ID로 사용되는 숫자 필드 및 설명으로 사용되는 문자열 필드)가있는 CSV 파일을 가져와야합니다. 그런 다음 문자열 필드를 개별 단어의 집합 (list? tuple? dict?)으로 변환하고 서로를 검색하여 일치 항목을 계산합니다.Python의 다른 문자열에서 개별 단어를 검색하십시오.

예 : id_field의 목록

id_field 1 has 2 matches in id_field 2 
id_field 1 has 2 matches in id_field 3 
id_field 2 has 3 matches in id_field 3 

사용 할 정도로 쉽게해야 csv 파일을 가져 일치

id_field | desc_field 
1  | some description 
2  | some other description 
3  | some third other description 

내가이 밖으로 필요하면된다

import csv 
reader = csv.reader(open('SOMEFILE.csv'), delimiter=',', quotechar='"' 

find 또는 in 연산자를 사용하여 단어를 찾고 계산할 수 있지만 CSV 문자열 필드를 검색 할 수있는 코드를 작성하는 데 어려움이 있습니다.

+0

안녕 존! 에 오신 것을 환영합니다. 네가 무엇을 요구하는지 이해하지 못한다. 그것을 명확히 할 수 있습니까? – darthbith

+0

또한 다음과 같은 줄이있는 경우 desc_field에''1''의 점수를줍니다 :''4 | 다른 순서의 설명과''5 | 그렇지 않으면 약간의 설명은 파란색으로''? – eyquem

답변

0

이 그것을 수행해야합니다

import csv 
reader = csv.reader(open('SOMEFILE.csv'), delimiter=',', quotechar='"') 
data = [[line[0], line[1].split()] for line in reader] 

for no1, words1 in data: 
    for i in range(int(no1), len(data)): 
     no2, words2 = data[i][0], data[i][1] 
     matches = len(words1 + words2) - len(set(words1 + words2)) 
     print 'id_field', no1, 'has', matches, 'matches in id_field', no2 

당신이 코드에 대한 어떤 문제 나 질문이 있으면 알려주세요. 나는 예를 들어 귀하의 예와 같이 전달을 점검하고자한다고 가정 했었습니다. 예를 들어, 1과 2가 일치하면 2, 3이 3이면 3을 확인하십시오. 당신이 제로 성냥의 경우를 제외하고 싶었다면

, 당신은 인쇄하기 전에 다음 줄을 추가하고 인쇄를 들여 수 :

if matched > 0: 
0
import csv 
import itertools 
import re 

id_2_desc = {} 

with open('SOMEFILE.csv') as csvfile: 
    reader = csv.reader(csvfile, delimiter='|') 

    for n, (id_field, desc_field) in enumerate(reader): 
     if n > 0: 
      id_2_desc[id_field.strip()] = desc_field.strip() 


id_fields = id_2_desc.keys() 


for id_field1, id_field2 in itertools.combinations(id_fields, 2): 
    desc_field1 = id_2_desc[id_field1] 
    desc_field2 = id_2_desc[id_field2] 

    desc_tokens1 = re.split('\s+', desc_field1) 
    desc_tokens2 = re.split('\s+', desc_field2) 

    matches = set(desc_tokens1) & set(desc_tokens2) 

    print 'id_field {} has {} matches in id_field {}'.format(id_field1, len(matches), id_field2) 
+1

다음과 같이하면 "열거 형"의 사용을 피할 수 있습니다 :''csvfile.readline()''at first – eyquem

+0

@eyquem : 맞아, 고마워! – user278064

관련 문제