我试图在两个字符串列表(listA
和listB
)之间获得最接近的匹配,以创建listC
。
这样做的目的是因为我必须清理一个包含一列字符串的数据框,每个字符串代表一个水果,某些条目有我需要修复的拼写错误。
我要修复的实际列名为test:
print(test)
输出:
0 lychee
1 strawberry
2 nectarine
3 lychee
4 lychee
5 banana
6 raspberry
7 loga!!n
....
37497 grape
37498 apple
37499 rockmelon
Name: fruit_ate, Length: 37500, dtype: object
然后我将测试列转换为名为newTest
的列表,并创建了一个正确名称的水果列表:
newTest = list(test)
fruits = ['lychee',
'strawberry',
'nectarine',
'banana',
'raspberry',
'kiwi',
'apple',
'durian',
'pear',
'logan',
'jackfruit',
'grape',
'peach',
'watermelon',
'rockmelon',
'orange']
我创建了一个遍历newList
的for循环并获取每个元素并返回水果列表中最接近的匹配。但是,正如我认为在我的代码工作之后尝试修复小列表会更容易,我可以用它来修复newTest
列表。
所以我创建了这些listA
和listB
。
我将测试列的一些值复制到listB
中,然后使用列表水果的值创建了listA
。
我设法做到的方式是:
listA = ['apple', 'banana', 'coco', 'grape', 'pear']
listB = ['ba88tana', 'peeaar', 'apple', 'ggra))pe']
listC = []
for i in listB:
listC.append(diff.get_close_matches(i, fruits, n=1, cutoff=0.5))
output: [['banana'], ['pear'], ['apple'], ['grape']]
当我运行它时它工作正常,但如果我将相同的算法应用于我的newTest
列表和水果列表它不起作用,它会说:TypeError: 'float' object is not iterable
。
如果有人知道如何修复它或我可以做到的其他方式,那将非常有帮助。
答案 0 :(得分:0)
在没有看到整个代码的情况下,当你将它与数据一起使用时,我猜想newTest是浮点数吗?
或者该行:
listC.append(diff.get_close_matches(i, fruits, n=1, cutoff=0.5))
函数diff可能正在接收float而不是字符串,例如
diff.get_close_matches(32, text, n=1, cutoff=.5)
而不是:
diff.get_close_matches('32', text, n=1, cutoff=.5)
如果您的数据是浮点数而不是字符串,则可能是这种情况。
for i in newTest:
diff.get_close_matches(str(i), text, n=1, cutoff=.5)
发布实际测试的相关部分有助于诊断。
答案 1 :(得分:0)
pip install editdistance
import editdistance
listA = ['apple', 'banana', 'coco', 'grape', 'pear']
listB = ['ba88tana', 'peeaar', 'apple', 'ggra))pe']
listC = []
for i in listB:
res = None
distance = len(i)+1
for j in listA:
diff = editdistance.eval(i, j)
if diff < distance:
distance = diff
res = j
listC.append(res)
print listC