运行 针对多值字典的嵌套列表中的所有值的查询
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
在您的多个列表中被发现,它将显示所有列表。
我有一个 '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
在您的多个列表中被发现,它将显示所有列表。