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
Зашел с другой стороны. Решение принято как верное, хотя подозреваю что далеко не оптимальное.
А где итератор? Итератор надо вернуть.
Не оптимальное, конечно, но на то и существуют прототипы. Это будет просто твоим прототипом, который ты можешь использовать для построения уже нормальной функции.
Прототипирование - это когда ты строишь сначала макет здания и на макете рассматриваешь все нюансы. Если ошибок нет, ты делаешь план дома, а потом делаешь макет фундамента дома и на макете рассматриваешь все нюансы. Если ошибок нет, ты делаешь план фундамента дома, а потом делаешь макет котлована для фундамента и на макете рассматриваешь все нюансы. Если ошибок нет, начинаешь копать котлован для фундамента. Потом макетируешь первый этаж дома и всё повторяется уже для него.
Когда программу делаешь, там вообще можно несколько программ понаделать, при этом они все работают, но их ты используешь только в роли макетов, на которых ты изучаешь все нюансы. Потом ты их не трогаешь, а начинаешь писать итоговую программу отдельно, используя всю выясненную информацию из этих макетов. При этом макет этот может быть просто макетом нерабочим или работающим частично - сильно выделять какую-то функцию разрабатываемой программы, которую нужно рассмотреть и изучить подробнее со всех сторон. Но также этот макет может стать полноценной программой и тогда это будет прототип твоей разрабатываемой программы. Ни макет, ни прототип не должны становиться программой, которую ты разрабатываешь, потому что получится говно со стопроцентной вероятностью. Это произойдёт потому, что макеты и прототипы - это схематичные вещи, не продуманные, не спланированные и так далее. Поэтому их ты используешь только для исследований, для экспериментов, для выявления подводных течений, которые не видны, когда просто думаешь, просто представляешь все процессы. Если тебе покажется, что ты сэкономишь время, если макет или даже прототип сделаешь конечной программой, потому что он уже так классно работает и очень похож на изначально планируемую программу, то это будет самой большой ошибкой, за которую ты потом дорого заплатишь; тебе придётся в три раза больше времени потом потратить на разработку программы, которую ты хотел сделать изначально. Рано или поздно этот макет навалит кучу говна тебе под нос, а сделать с этим ничего будет нельзя. И ты будешь рвать на себе волосы с вопросом “ну почему же я проигнорировал правило выбрасывания макета?! почему я был такой дурак?! мне же говорили! я читал!”, но будет уже поздно. Снимай парик, смывай татуировки и делай прогу с самого начала по всем правилам.
Вообще, старайся чаще выбрасывать программы, старайся не хранить их, потому что часто мы храним именно говно всякое, так как большего мы не достигли и поэтому так ценим его.
Потом уже ты дойдёшь до уровня, когда ты будет хранить их, но они все (готовые программы) станут готовыми макетами для твоей новой программы.
Я вот вчера буквально этим пользовался. Написал программу лет пять назад, делал её как службу. А вчера писал другую программу, она у меня работает через tor. Подключаюсь - нихрена не работает, нет подключения; позавчера ещё было, а вчера уже нет. Оказывается, сынок Кириенко занимается сейчас усиленно блокировкой Tor'а, чтобы его папку не снесли вместе со всей компашкой. Кто-то из них там. То есть они блокируют Tor тоже по IP, как и раньше делали с Telegram. Всё говорили про DPI, но, видимо, для DPI нужны специалисты, которые сейчас держатся от них подальше, чтобы репутацию не потерять. Так что ничего нового не придумали, всё так же блокируют по IP. А что можно сделать через блокировку по IP? Ну, ничего. Поэтому они блокируют по IP основной узел Tor'а, куда тот подключается, чтобы построить цепочку. Сайт блокируют и узел этот. Короче, торщики придумали мосты, через мосты всё работает. Так вот пришлось делать мосты в системном tor'е, а они не делаются. Потом выяснил, что у меня Selinux блокирует бинарник, который tor использует в качестве плагина для построения мостов. В итоге долго экспериментировал и нашёл решение, понадобилось сделать службу. В сам Selinux правило я добавить не смог, потому что при добавлении правила ничего как не работало, так и не работает. Но оказалось, что Selinux можно отключить, потом перезапустить tor, а потом Selinux включить. И тогда tor запускается без ограничений Selinux'а, но при этом и Selinux остаётся включенным и следит за безопасностью. А к tor'у подключиться снаружи нельзя. Так что можно это использовать только для локального повышения прав. Блин, можно весь хакатон собрать и там никто не сможет повысить права так. Так что решил Selinux дальше не копать, а просто так и оставить. Так я решил сделать службу, которая при загрузке делает эти три действия: отключает Selinux, перезапускает tor, включает Selinux. Так вот возник следующий вопрос: а как сделать службу? И я просто вспомнил, что пять лет назад сделал программу, которая висела как служба. Я этой программой уже давным-давно не пользуюсь, потому что вместо неё я написал года три назад браузерное расширение для Firefox'а, которое мне полностью заменило ту программу, которую я сделал пять лет назад. Но программа-то осталась, и служба в ней, которую я тогда написал, тоже осталась. Вот я просто взял эту службу из той программы и напрямую скопировал, заменив слова только в описании. Мне не пришлось ничего вспоминать, потому что в той моей программе уже всё написано, так как установщик, через который ставилась служба в систему, я тоже сам написал. Всё запустилось сразу. Казалось бы, нафиг нужна программа, которой не пользуешься уже года три. А вот, оказалось, что вполне можно взять из неё кусок чего-то, что даже не планировалось для копирования, и напрямую его задействовать. Всё это сильно сэкономило мне время, потому что вчера я только полдня с этим Selinux'ом сидел и выяснял, как он там контексты хранит, из чего они состоят, и что все эти части значат.
Так что эту функцию, которую ты сделал, доделаешь до итератора, а потом, когда она вся работает и правильно работает, отложишь в сторону и напишешь всё заново с пустого листа. При написании будешь использовать эту функцию как прототип. Так ты получишь оптимальность.
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'
Там бы он нашёл ключ 6 и дальше бы с ним работал как с легальным. facepalm.