获取TypeError:使用字符串列表时,'float'对象不可迭代

时间:2017-12-03 21:25:22

标签: python data-cleaning difflib

我试图在两个字符串列表(listAlistB)之间获得最接近的匹配,以创建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列表。

所以我创建了这些listAlistB。 我将测试列的一些值复制到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

如果有人知道如何修复它或我可以做到的其他方式,那将非常有帮助。

2 个答案:

答案 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

代码(nearest.py)

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