Отсортировать словарь по определённому значению
Мне нужно отсортировать словарь words по значению b, как это сделать не совсем понимаю.
i = 0
words = {}
res = txt.get()
with open('word_search.csv', newline='') as File:
reader = csv.reader(File)
for row in reader:
b = fuzz.WRatio(res, row)
if b >= 75:
words[i] = [b, row]
i += 1
sorted(words,reverse=True)
for row in words:
print(words[row])
Входное слово: googl
Пример вывода:
[90, ['go']]
[90, ['l']]
[90, ['o']]
[90, ['g']]
[91, ['google']]
[90, ['oo']]
[90, ['gl']]
[90, ['og']]
[90, ['goo']]
[89, ['goog']]
[90, ['googlebot']]
[75, ['gol']]
[90, ['googling']]
[83, ['googled']]
Ответы (1 шт):
Не сразу понял, что у вас словарь, плюс ключи словаря - просто порядковые номера в списке, а не рейтинг. Вы не запоминаете никуда результат сортировки, а кроме того у вас сортировка идёт по ключу словаря, где нет нужной для сортировки информации. Можно сделать так:
for k,v in sorted(words.items(), key=lambda x: x[1][0], reverse=True):
print(v[0], v[1])
Вывод:
91 ['google']
90 ['l']
90 ['o']
90 ['g']
90 ['oo']
90 ['gl']
90 ['og']
90 ['goo']
90 ['googlebot']
90 ['googling']
89 ['goog']
83 ['googled']
75 ['gol']
Пояснения:
- итерация по словарю равнозначна итерации по его ключам
.keys(), поэтому нужно использовать.items(), чтобы уsortedбыла полная информация об элементах словаря, а не только ключ, котором только порядковый номер элемента - содержимое элементов при этом получается такое примерно:
(0, [90, ['l']]), т.е. список в кортеже, и чтобы достать оттуда рейтинг нужно взять элемент 1 из кортежа, чтобы получить список, и потом взять элемент 0 этого списка
В целом вы не очень правильно используете словарь, у вас фактически получился аналог списка, к списку точно так же можно обращаться по порядковым номерам элементов, большого смысла в таком словаре нет. Имело бы больше смысла сделать словарь, ключом которого было бы значение рейтинга, а значением - список слов, у которых такой рейтинг. Тогда сортировку можно было бы делать как-раз таки просто по ключам словаря.