Форум сайта python.su
857
Вот такой можешь оставить
>>> def frequency_sort(items): ... dct = {} ... for i in items: ... if i in dct: ... dct[i] += 1 ... else: ... dct[i] = 1 ... tmp = [] ... while dct: ... kmax, vmax = max(dct.items(), key=lambda i: i[1]) ... tmp.extend(vmax * [kmax]) ... del dct[kmax] ... out = iter(tmp) ... return out ... >>> it = iter(['a', 'a', 'b', 'a', 1, 2, 3, 1, 2, 3, 1, 4]) >>> out = frequency_sort(it) >>> out <list_iterator object at 0x7f3681879860> >>> list(out) ['a', 'a', 'a', 1, 1, 1, 2, 2, 3, 3, 'b', 4] >>>
>>> def frequency_sort(items): ... dct = {} ... for i in items: ... if i in dct: ... dct[i] += 1 ... else: ... dct[i] = 1 ... while dct: ... kmax, vmax = max(dct.items(), key=lambda i: i[1]) ... for i in vmax * [kmax]: ... yield i ... del dct[kmax] ... >>> it = iter(['a', 'a', 'b', 'a', 1, 2, 3, 1, 2, 3, 1, 4]) >>> out = frequency_sort(it) >>> out <generator object frequency_sort at 0x7f4bf7de9ba0> >>> list(out) ['a', 'a', 'a', 1, 1, 1, 2, 2, 3, 3, 'b', 4] >>>
Офлайн
0
py.user.nextНадоело со мной возиться? Решил выложить готовое решение, а я бы допилил итератор. С этими штуками: extend, yield я пока не знаком.
Вот такой можешь оставить
Офлайн
0
Решения которые там даны, если интересно:
Best “Creative” Solution
frequency_sort = lambda a: sorted(a, key=lambda x: (-a.count(x), a.index(x)))
from collections import Counter def frequency_sort(items): groups = Counter(items) sort = sorted(groups.items(), key=lambda e: e[1], reverse=True) for key, value in sort: yield from [key]*value
Офлайн
857
ShevЭто всё прикольно, конечно, пока этот же код не понадобится в другой программе на другом языке программирования. Там первым делом надо будет написать Counter(), потому что его нигде нет, кроме питона, потом написать стабильную сортировку, которая гарантированно не переставляет элементы, которая мало где реализована. И вот тут-то окажется, что этот Python-код совершенно не пригоден для его перевода на другой язык - на Go, на Rust, на Java и на многие другие - и придётся писать код как раз такой, который выше написан и реализуем на любом языке (за исключением итератора, который не везде такой удобный, как в питоне, и придётся его доделать). Так что это соревнование теоретиков.
Best “Speedy” Solution
ShevЭто вообще квадратную сложность имеет. Что .count(), что .index() квадратно использовать там, где можно применить однопроходный алгоритм с линейной сложностью, - уровень школоты, не писавшей ничего, естественно. Какой итератор он собрался так сортировать? На десять элементов? А миллионный вообще повиснет и будет очень долго выполнять миллион count'ов и ещё миллион index'ов. То, что у итераторов нет методов .count() и .index(), - это вообще другой вопрос, да и были бы они, всё равно туфта получилась бы.
Best “Creative” Solution
ShevДа не, вот эту умную функцию внутри функции ты стопудов бы оставил, ведь она выглядит так умно. А то, что она не тестируется юнит-тестами, ты бы тоже ещё не знал.
а я бы допилил итератор
Отредактировано py.user.next (Фев. 20, 2022 16:03:11)
Офлайн
0
py.user.nextДругие языки - это слишком далекая перспектива для меня. Пока моя цель - Python. В любом случае, огромное спасибо за помощь!
пока этот же код не понадобится в другой программе на другом языке программирования
Офлайн