2013-10-04 177 views
0

我的問題有幾個問題需要解決。我需要導入一個帶有兩個字段(用作ID的數字字段,以及用作描述的字符串字段)的CSV文件。然後,將字符串字段轉換爲各個單詞的集合(list?tuple?dict?),並搜索彼此集以計算匹配。從Python中的另一個字符串搜索字符串

例如:

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

我需要什麼了。這是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文件應該很容易使用要做到:

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

我敢肯定,我可以使用find或in操作符來處理查找和計算單詞,但是我無法編寫能夠讓我搜索csv字符串字段的代碼。

+0

嗨約翰!歡迎來到SO。我不明白你在問什麼。你能澄清一下嗎? – 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和3的匹配時,在2時檢查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

你可以避開''enumerate''的用法:''csvfile.readline()''開頭 – eyquem

+0

@eyquem:對,謝謝! – user278064

相關問題