循环并比较两个不等长字典的行
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
循环。
我有 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
循环。