我有两个长度不等的文件,每个文件都包含一列名字。我想使用fuzzywuzzy比较这些名称并确定匹配。但是,使用下面的脚本而不是将file1中name列中的所有值与file2中name列中的所有值进行比较,它只将file1的第一行与file2的所有行进行比较。有人可以请求帮助脚本进行所有成对比较吗?谢谢!
from fuzzywuzzy import fuzz
from fuzzywuzzy import process
import csv
file1_loc = 'file1.csv'
file2_loc = 'file2.csv'
file1 = csv.DictReader(open(file1_loc, 'rb'), delimiter=',', quotechar='"')
file2 = csv.DictReader(open(file2_loc, 'rb'), delimiter=',', quotechar='"')
for line in file1:
for line2 in files2:
partial_ratio = fuzz.partial_ratio(str(line['NAME']), str(line2['PNODENAME']))
if partial_ratio > 60:
bus_name.append(line['NAME'])
pnode_name.append(line2['PNODENAME'])
score_50_plus.append(partial_ratio)
print partial_ratio
print line['NAME']
print line2['PNODENAME']
编辑为了澄清我有218个名字的列表,我将调用list1和1172个名字的列表,我将调用list2。我认为list1中的名字对应于list2中的一些名称,但它们并不完全匹配,所以我不能做大致相同的事情:
matches = []
for line in list1:
if line in list2:
matches.append(line)
相反,我希望将list1中每个名称的fuzz.partial_ratio添加到list2中的每个名称。类似的东西:
for line in list1:
partial_ratio = fuzz.partial_ratio(line, list2[0]
for line in list1:
partial_ratio = fuzz.partial_ratio(line, list2[1]
for line in list1:
partial_ratio = fuzz.partial_ratio(line, list[2])
无需为循环写入1172(如果我将其反转,则为218)。
答案 0 :(得分:0)
真正的问题是files2
的迭代器在files1
的第一次迭代中消耗了。为files1
的每次迭代重新创建迭代器修复了问题。
由于你想进行逐行比较,嵌套循环无济于事 - 两个迭代器必须“一起移动”。出于此目的,我们可以使用izip
中的itertools
:
from itertools import izip_longest
for l1, l2 in izip_longest(file1, file2):
if all((l1, l2)):
partial_ratio = fuzz.partial_ratio(str(l1['NAME']), str(l2['PNODENAME']))
您可以使用上面的for
构造替换2 izip
个循环。