Форум сайта python.su
0
def frequency_sort(items): sorting_items = {} for i in items: if i in sorting_items: sorting_items[i] += 1 else: sorting_items[i] = 1 result = [] for key in sorting_items: count = 0 while count < sorting_items[key]: result.append(key) count += 1 return result
Отредактировано Shev (Фев. 17, 2022 12:19:15)
Офлайн
124
ShevУ вас в задаче требуется отсортировать итератор.Почитайте чем отличаются итератор, список, множество, словарь,генератор, вложенный список, генераторное выражение.
неправильно потому что там count используется?
Офлайн
0
xam1816Подождите, дойдем и до туда, не все сразу
У вас в задаче требуется
Офлайн
0
def frequency_sort(items): sorting_items = {} for i in items: if i in sorting_items: sorting_items[i] += 1 else: sorting_items[i] = 1 result = [] while len(sorting_items) > 0: max_values = max(sorting_items.values()) count = 0 while count < max_values: result.append(sorting_items[max_values]) count += 1 del sorting_items[max_values] return result
Офлайн
124
ShevВот вам для обучения несколько лайвхаков:
Подождите, дойдем и до туда, не все сразу
def frequency_sort(items): sorting_items = {} for i in items: if i in sorting_items: sorting_items[i] += 1 else: sorting_items[i] = 1 print('sort_items после заполнения: ',sorting_items) result = [] while len(sorting_items) > 0: max_values = max(sorting_items.values()) count = 0 print('max_values:', max_values) while count < max_values: print(sorting_items[max_values]) result.append(sorting_items[max_values]) count += 1 del sorting_items[max_values] return result seq = iter(['a', 'a', 'b', 'b', 'b', 'c', 'd', 'e', 'e', 'e', 'e', 'e', 'e']) res = frequency_sort(seq) print(res)
Отредактировано xam1816 (Фев. 17, 2022 16:14:16)
Офлайн
0
xam1816в Pycharm есть пошаговое выполнение, там видно значение всех переменных на каждом шаге. Я видел где именно вылетает ошибка, да я ее загуглил, но все равно не понял.
вот пример с принтами
Shev
переменная с ключом после удаления переопределяется
Офлайн
0
def frequency_sort(items): sorting_items = {} for i in items: if i in sorting_items: sorting_items[i] += 1 else: sorting_items[i] = 1 sorting_items_A = list(sorting_items.items()) result = [] while len(sorting_items_A) > 0: count = 0 while count < max(sorting_items_A,key=lambda i:i[1])[1]: result.append(max(sorting_items_A,key=lambda i:i[1])[0]) count += 1 del sorting_items_A[sorting_items_A.index(max(sorting_items_A,key=lambda i:i[1]))] return result
Офлайн
124
sorting_items после заполнения: {'a': 2, 'b': 3, 'c': 1, 'd': 1, 'e': 6}
max_values: 6
line 15, in frequency_sort
print(sorting_items[max_values])
KeyError: 6Shevвы видите в print() выведен словарь sorting_items где у ключа ‘a’ значение 2, у ‘b’ значение 3 и тд
в Pycharm есть пошаговое выполнение, там видно значение всех переменных на каждом шаге.
print(sorting_items[max_values])
sorting_items[6]
ShevФишка в том что до туда интерпретатор даже не дошел, остановился когда была ошибка
ведь переменная с ключом после удаления переопределяется, в чем фишка?
Онлайн
ShevРазве она не выше в строках по коду чем
Я видел где именно вылетает ошибка,
del sorting_items[max_values]
Офлайн
857
ShevДа, неправильно потому, что там .count() используется. Если в словаре миллион единиц, то он на каждой единице останавливается и пересчитывает весь этот миллион единиц каждый раз, чтобы узнать, сколько там единиц.
Мой второй вариант выдает такой же словарь, неправильно потому что там count используется?
>>> def frequency_sort(items): ... b = {} ... for i in range(len(items)): ... b[items[i]] = items.count(items[i]) ... return b ... >>> frequency_sort([1, 2, 3, 1, 2, 3, 1]) {1: 3, 2: 2, 3: 2} >>> >>> frequency_sort(iter([1, 2, 3, 1, 2, 3, 1])) Traceback (most recent call last): File "<stdin>", line 1, in <module> File "<stdin>", line 3, in frequency_sort TypeError: object of type 'list_iterator' has no len() >>>
ShevВот-вот, вызывает большие вопросы то, как ты пытаешься разобраться. Это в какой такой книге тебя учили применять .count() везде где только можно? Наверное, не надо читать эту книгу вообще, потому что их и новички пишут часто. Понапишут херотни, а ты потом с умным видом её читаешь. А её писал какой-нибудь крендель, который сам не понимает нихера и который ни одной программы не написал за всю свою жизнь.
пытаюсь разобраться самостоятельно (книги, интернет)
ShevЗначит, работать вообще не будешь. А кому нужен пердун, который вообще нихера делать не умеет, так ещё и в магазин за бананами ему ходить тяжело из-за протрузий? Сделают тебе “до свидания” очень быстро.py.user.nextЯ староват для этого).
пиджачке бегать по этажам
ShevА где итератор? Итератор надо вернуть.
Зашел с другой стороны. Решение принято как верное, хотя подозреваю что далеко не оптимальное.
xam1816Самое прикольное бы началось, если бы у него при этом исходный итератор был в виде
смотрю в словарь sorting_items и ищу ключ 6 и …. не нахожу! Есть там ключ ‘a’,'b','c','d','e', а где ключ 6 ??? Key Error! такого ключа нет.
'a', 'a', 'a', 'b', 'b', 3, 7, 6, 6, 'c', 'c', 'd', 'c', 'e'
Отредактировано py.user.next (Фев. 17, 2022 20:23:31)
Офлайн
0
xam1816Это говорит о том, что перерывы делать надо и переключаться временно на другое занятие. Банальная невнимательность: получаю значение max_values и пытаюсь подставить в качестве ключа, естественно его нет.
Это говорит о том что нужно читать что такое словарь, список, множество, кортеж, генератор, итератор и тд.
def frequency_sort(items): sorting_items = {} for i in items: if i in sorting_items: sorting_items[i] += 1 else: sorting_items[i] = 1 result = [] def get_key(d, value): for k, v in d.items(): if v == value: return k while len(sorting_items) > 0: max_values = max(sorting_items.values()) count = 0 while count < max_values: result.append(get_key(sorting_items, max_values)) count += 1 del sorting_items[get_key(sorting_items, max_values)] return result
Офлайн