循环并比较两个不等长字典的行

时间:2015-01-05 04:24:48

标签: python csv

我有两个长度不等的文件,每个文件都包含一列名字。我想使用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)。

1 个答案:

答案 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个循环。