Изменить длину словаря до определенного значения и оставить ключи с самыми высокими значениями

1

Привет, ребята, поэтому я работаю над этим скриптом, где мне нужно обновить словарные words с самыми частыми словами, ограниченными значением limit.

from typing import List, Dict, TextIO, Tuple
def most_frequent(words: Dict[str, int], limit: int) -> None:

new_dict = {}
new_list = []
#I decided to create a list for easier sort

for w in words:
    new_list.append((keys, words.get(w)))
    new_list.sort(key=sorting, reverse=True)
    #key=sorting: used to sort by the value of the key from big to small 

for n_w in new_list:
    if len(new_dict) < limit:
        new_dict[n_w[0]] = n_w[1]
#this part add the words to a new dictionary up to the value of limit

words = new_dict
print(words)
#print just to check my result, I know it supposed to return None

Вот проблема: мне нужно выполнить следующие тестовые примеры: len(words) <= limit, если добавлены самые частые слова и приводит к len(words) > limit ни один из них не добавляется; и если последнее слово не является уникальным и имеет то же значение, что и следующее, ни одно из них не добавляется.

>>> most_frequent({'cat': 3, 'dog': 3, 'pig': 3, 'bee': 3, 'rat': 1}, 4)
{'cat': 3, 'dog': 3, 'pig': 3, 'bee': 3}
#This one passes

>>> most_frequent({'cat': 3, 'dog': 3, 'pig': 3, 'bee': 2, 'rat': 2}, 4)
{'cat': 3, 'dog': 3, 'pig': 3}
#what I get {'cat': 3, 'dog': 3, 'pig': 3, 'bee': 2},  'bee' doesn't get added because is tied with 'rat'

>>> most_frequent({'cat': 3, 'dog': 3, 'pig': 3, 'bee': 3, 'rat': 1}, 3)  
{}
#what I get {'cat': 3, 'dog': 3, 'pig': 3}, none of them are added because there are 4 with high frequency but if they get added words > limit and it can't be

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

  • 0
    Почему most_frequent({'cat': 3, 'dog': 3, 'pig': 3, 'bee': 3, 'rat': 1}, 3) должны быть пустыми? Я думаю, что будет лучше, если вы объясните причину каждого выхода.
  • 1
    @DanielMesejo Я только что сделал это
Теги:
python-3.x

1 ответ

0

Я бы сделал что-то вроде этого:

def most_frequent(words, limit):
    frequencies = words.items()
    inverse = {}
    for word, frequency in frequencies:
        inverse.setdefault(frequency, []).append(word)

    result = {}
    remaining = limit
    for frequency in sorted(inverse.keys(), reverse=True):
        if len(inverse[frequency]) <= remaining:
            result.update({word: frequency for word in inverse[frequency]})
            remaining -= len(inverse[frequency])
        else:
            break

    return result


print(most_frequent({'cat': 3, 'dog': 3, 'pig': 3, 'bee': 3, 'rat': 1}, 4))
print(most_frequent({'cat': 3, 'dog': 3, 'pig': 3, 'bee': 2, 'rat': 2}, 4))
print(most_frequent({'cat': 3, 'dog': 3, 'pig': 3, 'bee': 3, 'rat': 1}, 3))

Выход

{'bee': 3, 'dog': 3, 'pig': 3, 'cat': 3}
{'dog': 3, 'pig': 3, 'cat': 3}
{}

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

  • 0
    Я вижу, что ты сделал! лучше иметь значения ключей в качестве ключей, хорошо, подождите, позвольте мне усвоить это

Ещё вопросы

Сообщество Overcoder
Наверх
Меню