2

我有一个'collections.defaultdict'(见下面的x),它是一个多值字典。与每个唯一键关联的所有值都存储在一个列表中。

    >>>x
    defaultdict(<type 'list'>, {'a': ['aa', 'ab', 'ac'], 'b': ['ba', 'bc'], 'c': ['ca', 'cb', 'cc', 'cd']})

我想使用 Python blurwuzzy 包来针对嵌套在多值字典中的所有值搜索目标字符串,并根据 Fuzzywuzzy 的内置编辑距离公式返回前 5 个匹配项。

    from fuzzywuzzy import fuzz
    from fuzzywuzzy import process
    query = 'bc'
    choices = x
    result = process.extract(query, choices, limit=5)

然后我将运行一个过程,该过程采用最接近的匹配(具有最高模糊率分数的值)并识别最接近的匹配值与哪个键相关联。在这个例子中,最接近的匹配值当然是 'bc' 并且关联的键是 'b'。

我的问题是:我如何对字典嵌套列表中的所有值运行fuzzywuzzy 查询?当我运行上面的fuzzywuzzy 过程时,我得到一个TypeError:预期的字符串或缓冲区。

4

2 回答 2

1

要从平面列表中的字典中获取列表中的所有值,请使用
from itertools import chain并更改该行

choices = x

choices = chain.from_iterable(x.values())

set如果在您的真实数据中有重叠的值,请考虑利用它。

结果:

[('bc', 100), ('ba', 50), ('ca', 50), ('cb', 50), ('cc', 50)]
于 2016-02-03T07:34:49.690 回答
1

你可以这样做:

from fuzzywuzzy import process
from collections import defaultdict

x = defaultdict(list, {'a': ['aa', 'ab', 'ac'], 'b': ['ba', 'bc'], 'c': ['ca', 'cb', 'cc', 'cd']})
query = 'bc'
reverse = defaultdict(list)

for k1, v1 in x.items():
    for v2 in v1:
        reverse[v2].append(k1)

match = process.extractOne(query, chain.from_iterable(x.values()))

print match[0]
print reverse[match[0]]

这将显示:

bc
['b']

它首先创建一个逆字典,以便更容易找到fuzzywuzzy匹配的条目。然后它创建所有值的列表并将其传递给extractOne. 然后可以在反向字典中查找返回的匹配项,以显示包含匹配项的所有键的列表。如果bc在您的多个列表中找到,它将显示所有列表。

于 2016-02-03T07:48:33.777 回答