1

У меня есть «collection.defaultdict» (см. Ниже), который является многозначным словарем. Все значения, связанные с каждым уникальным ключом, сохраняются в списке.Запуск запроса по всем значениям внутри вложенных списков многозначного словаря

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

Я хочу использовать fuzzywuzzy пакет Python для того, чтобы найти целевую строку против всех значений, вложенных в многозначном словаре и вернуть топ 5 матчей, основанных на fuzzywuzzy встроенного расстояния редактирования формулы.

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

И тогда запустить процесс, который принимает значение, наиболее близкое значение (с самым высоким отношением пуха балла) и определяет, какая клавиша, которая ближе всего соответствует значение, связанных с. В этом примере самым близким совпадающим значением является, конечно, «bc», а связанный с ним ключ - «b».

Мой вопрос: Как запустить fuzzywuzzy-запрос со всеми значениями внутри вложенных списков словаря? Когда я запускаю процесс fuzzywuzzy выше, я получаю строку TypeError: ожидаемую строку или буфер.

ответ

0

Чтобы получить все значения в списках из словаря в виде плоского списка, используйте
from itertools import chain и изменить линию

choices = x 

в

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

Рассмотрим сделать set из того, что если в ваших реальных данных у вас есть перекрывающиеся значения.

результат:

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

Вы могли бы сделать это следующим образом:

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 было найдено в нескольких списках, он отобразит все их.

Смежные вопросы