我有一个' collections.defaultdict' (见下面的x),这是一个多值字典。与每个唯一键关联的所有值都存储在列表中。
>>>x
defaultdict(<type 'list'>, {'a': ['aa', 'ab', 'ac'], 'b': ['ba', 'bc'], 'c': ['ca', 'cb', 'cc', 'cd']})
我想使用Python fuzzywuzzy包,以便针对嵌套在多值字典中的所有值搜索目标字符串,并根据fuzzywuzzy的内置编辑距离公式返回前5个匹配项。
from fuzzywuzzy import fuzz
from fuzzywuzzy import process
query = 'bc'
choices = x
result = process.extract(query, choices, limit=5)
然后我将运行一个过程,该过程采用最接近的匹配(具有最高模糊比分数的值),并确定哪个键与最匹配的值相关联。在这个例子中,最接近的匹配值当然是&#39; bc&#39;并且关联的密钥是&#39; b&#39;
我的问题是:如何针对字典嵌套列表中的所有值运行fuzzywuzzy查询?当我运行上面的fuzzywuzzy进程时,我得到一个TypeError:期望的字符串或缓冲区。
答案 0 :(得分:1)
要从平面列表中的词典中获取列表中的所有值,请使用左from itertools import chain
并更改行
choices = x
到
choices = chain.from_iterable(x.values())
如果您的实际数据中存在重叠值,请考虑使用set
。
结果:
[('bc', 100), ('ba', 50), ('ca', 50), ('cb', 50), ('cc', 50)]
答案 1 :(得分: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
,则会显示所有列表。