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]
>>>
То есть функция next() может быть применена только к итератору. И где-то кто-то может её применять уже и ждать от тебя отсортированный итератор, а ты вернёшь ему список, который вызовет исключение и падение программы, когда функция next() попытается взять элемент из этого списка.
Тебе сказали отсортировать итератор - будь добр взять его, отсортировать его и вернуть в результате такой же итератор, с которым можно дальше работать как с итератором. Это идеал.
В реальных же задачах данные могут быть вообще на миллионы и миллиарды элементов (датчик температуры с улицы Сезам посылает значения текущей температуры вообще бесконечно). Ты не сможешь хранить такие списки ни в памяти, ни где-то даже в разрозненном виде. Поэтому используются итераторы, где в памяти хранится только один элемент, а после его взятия из итератора он стирается и на его место ставится следующий элемент.