Форум сайта python.su
0
Отсортируйте данный итератор таким образом, чтобы его элементы оказались в порядке убывания частоты их появления, то есть по количеству раз, которое они появляются в элементах. Если два элемента имеют одинаковую частоту, они должны оказаться в том же порядке, в котором стояли изначально в итераторе.
def frequency_sort(items): return (sorted(items, key=lambda x: items.count(x))) [::-1]
Офлайн
857
Shev.count() не надо использовать.
Желательно не готовое решение, а подсказка, чтобы дойти самому.
Офлайн
0
py.user.nextНепонятно, откуда взялся такой вывод? Разве то, что я написал не сортирует итератор по количеству включений или решается какая то другая задача? Я новичок в программировании, но читаю русский текст вполне сносно.
Видимо, ты не понял задачу и наконструировал себе в фантазиях другую задачу и стал её решать
Офлайн
857
ShevЭто я перепутал. У тебя в задании написано так, будто итератор содержит элементы, внутри которых надо что-то искать.
Непонятно, откуда взялся такой вывод?
ShevПоявиться в элементе может что-то, когда он сам по себе контейнер - список, кортеж, множество. А итератор может содержать не только простые элементы, но и списки, и кортежи, и даже другие итераторы, которые могут содержать тоже что угодно.
то есть по количеству раз, которое они появляются в элементах
ShevСортирует. Только вот функции sorted() всё равно на порядок элементов; она их переставляет как хочет, лишь бы в конце они стали отсортированы. Поэтому тебе придётся сортировать самому, чтобы порядок не нарушился. Да и получить надо итератор в итоге. Можно, конечно, съехать и сказать, что можно получить список и сделать из него итератор в любой момент, но если этот объект уже участвует в какой-то цепочке действий, то вполне вероятно, что от него ждут наличия интерфейса итератора. А у списка интерфейса итератора нет.
Разве то, что я написал не сортирует итератор по количеству включений
>>> it = iter([1, 1, 1, 3, 3, 2, 2, 2]) >>> sorted(it) [1, 1, 1, 2, 2, 2, 3, 3] >>> sorted(it) [] >>> sorted(it) [] >>>
>>> def frequency_sort(items): ... return (sorted(items, key=lambda x: items.count(x))) [::-1] ... >>> frequency_sort([1, 1, 1, 3, 3, 2, 2, 2]) [2, 2, 2, 1, 1, 1, 3, 3] >>>
>>> def frequency_sort(items): ... return (sorted(items, key=lambda x: items.count(x))) [::-1] ... >>> it = iter([1, 1, 1, 2, 2, 2, 3, 3]) >>> frequency_sort(it) Traceback (most recent call last): File "<stdin>", line 1, in <module> File "<stdin>", line 2, in frequency_sort File "<stdin>", line 2, in <lambda> AttributeError: 'list_iterator' object has no attribute 'count' >>>
>>> def sort_iter(it): ... return sorted(it) ... >>> it = iter([1, 1, 1, 3, 3, 2, 2, 2]) >>> out = sort_iter(it) >>> out [1, 1, 1, 2, 2, 2, 3, 3] >>> next(out) Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: 'list' object is not an iterator >>>
>>> def sort_iter(it): ... return iter(sorted(it)) ... >>> it = iter([1, 1, 1, 3, 3, 2, 2, 2]) >>> out = sort_iter(it) >>> out <list_iterator object at 0x7fdf6a2c1780> >>> next(out) 1 >>> next(out) 1 >>> list(out) [1, 2, 2, 2, 3, 3] >>>
Отредактировано py.user.next (Фев. 15, 2022 00:35:46)
Офлайн
124
добавить reverse=True и будет по условию
def frequency_sort2(items): return sorted(items, key=lambda x: items.count(x),reverse=True)
py.user.nextсо словарем понятно, интересно вот это
Здесь нужен один проход по итератору, в результате которого появляется словарь.
py.user.nextя словарь также sorted() отсортировал, а как через итератор делать?
Потом по этому словарю строишь новый итератор. И в новом итераторе будут все те же элементы, что и в исходном итераторе, только они будут идти в этом порядке, который указан в задаче.
Офлайн
857
xam1816sorted() переставит элементы произвольно. А там нужно выбирать максимальный из словаря, переставлять в новый словарь (или кортеж пар), потом удалять его из словаря и дальше снова выбирать максимальный из словаря и перекидывать его в новый словарь (или кортеж пар). Когда второй словарь (или кортеж пар) будет готов полностью, можно сделать из него список всех элементов и потом этот список передать в iter() и вернуть получившийся объект, либо сделать генератор с помощью генераторного выражения, который тоже итератором является, и вернуть получившийся объект.
я словарь также sorted() отсортировал
{2: 258, 3:8, 1: 258}
Отредактировано py.user.next (Фев. 15, 2022 00:51:25)
Офлайн
0
py.user.nextПочему максимальный? По количеству вхождений сортировка нужна. Словарь я соорудил примерно так:
А там нужно выбирать максимальный из словаря
def frequency_sort(items): b = {} for i in range(len(items)): b[i] = items[i] return b
def frequency_sort(items): b = {} for i in range(len(items)): b[items[i]] = items.count(items[i]) return b
Отредактировано Shev (Фев. 16, 2022 18:26:47)
Офлайн
124
def sort_entry_count(items): d = {} for i in items: if i in d: d[i] += 1 else: d[i] = 1 sorted_d = sorted(d, key=lambda k: d[k], reverse=True) return (i for i in sorted_d for _ in range(d[i])) # seq = iter(['a', 'a', 'b', 'b', 'b', 'c', 'd', 'e', 'e', 'e', 'e', 'e', 'e']) res = sort_entry_count(seq) print(res) for i in res: print(i, ' ', end='')
<generator object sort_entry_count.<locals>.<genexpr> at 0x0000022F55E39B60>
e e e e e e b b b a a c d
Process finished with exit code 0
Офлайн
857
ShevНе, словарь вот xam1816 составил правильно.
Почему максимальный? По количеству вхождений сортировка нужна. Словарь я соорудил примерно так:def frequency_sort(items): b = {} for i in range(len(items)): b[i] = items[i] return b
The built-in sorted() function is guaranteed to be stable. A sort is stable if it guarantees not to change the relative order of elements that compare equal — this is helpful for sorting in multiple passes (for example, sort by department, then by salary grade).
commit 9b1e92f5a199acf20041372950b96e5896e1b634
Author: Ezio Melotti <ezio.melotti@gmail.com>
Date: Tue Oct 28 12:57:11 2014 +0100
#22237: document that sorted() is guaranteed to be stable. Initial patch by Martin Panter.
Отредактировано py.user.next (Фев. 17, 2022 00:08:28)
Офлайн
0
py.user.nextМой второй вариант выдает такой же словарь, неправильно потому что там count используется?
вот xam1816 составил правильно
py.user.nextЯ староват для этого). Чтобы было понимание: мне много лет, с Python пытаюсь разобраться самостоятельно (книги, интернет)
пиджачке бегать по этажам
Офлайн