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

Looping through and comparing lines of two unequal length dictionaries

我有 2 个不等长的文件,每个文件都包含一列名称。我想使用 fuzzywuzzy 来比较这些名称并识别匹配项。但是,使用下面的脚本而不是将 file1 中名称列中的所有值与 file2 中名称列中的所有值进行比较,它仅将 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']

编辑 为了澄清,我将调用 list1 的 218 个名称列表和将调用 list2 的 1172 个名称的列表。我认为 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 个 for 循环(或者 218,如果我将其反转)。

真正的问题是 files2 的迭代器被 files1 的第一次迭代消耗掉了。为 files1 的每次迭代重新创建迭代器解决了这个问题。

既然你想逐行比较,嵌套循环也无济于事——两个迭代器必须 "move together"。为此,我们可以使用 itertools 中的 izip

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']))

您可以用上面的 izip 构造替换您拥有的 2 个 for 循环。