运行 针对多值字典的嵌套列表中的所有值的查询

Run a query against all values within nested lists of a multi-valued dictionary

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

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

我想使用 Python fuzzywuzzy 包来针对嵌套在多值字典中的所有值和 return 基于 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: expected string or buffer。

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

choices = x

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

如果您的真实数据中有重叠值,请考虑从中制作一个 set

结果:

[('bc', 100), ('ba', 50), ('ca', 50), ('cb', 50), ('cc', 50)]

您可以按如下方式进行:

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 在您的多个列表中被发现,它将显示所有列表。