Найти - Пользователи
Полная версия: Задача по Python
Начало » Центр помощи » Задача по Python
1 2 3
py.user.next
Вот такой можешь оставить
  
>>> 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]
>>>
Shev
py.user.next
Вот такой можешь оставить
Надоело со мной возиться? Решил выложить готовое решение, а я бы допилил итератор. С этими штуками: extend, yield я пока не знаком.
Shev
Решения которые там даны, если интересно:
Best “Creative” Solution
 frequency_sort = lambda a: sorted(a, key=lambda x: (-a.count(x), a.index(x)))
Best “Speedy” Solution
 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
py.user.next
Shev
Best “Speedy” Solution
Это всё прикольно, конечно, пока этот же код не понадобится в другой программе на другом языке программирования. Там первым делом надо будет написать Counter(), потому что его нигде нет, кроме питона, потом написать стабильную сортировку, которая гарантированно не переставляет элементы, которая мало где реализована. И вот тут-то окажется, что этот Python-код совершенно не пригоден для его перевода на другой язык - на Go, на Rust, на Java и на многие другие - и придётся писать код как раз такой, который выше написан и реализуем на любом языке (за исключением итератора, который не везде такой удобный, как в питоне, и придётся его доделать). Так что это соревнование теоретиков.

О чём речь идёт: вот YouTube изначально реализовывался на питоне, а потом Google заказала язык Go и после его релиза стала переписывать продукты свои с Python на Go. И вот что лучше, если один человек перепишет питоновский код на Go, потому что надо только переводить то, что уже готово и надёжно отлажено, или если десять человек заново напишут весь код на Go, потому что с питона он не переводится?

Shev
Best “Creative” Solution
Это вообще квадратную сложность имеет. Что .count(), что .index() квадратно использовать там, где можно применить однопроходный алгоритм с линейной сложностью, - уровень школоты, не писавшей ничего, естественно. Какой итератор он собрался так сортировать? На десять элементов? А миллионный вообще повиснет и будет очень долго выполнять миллион count'ов и ещё миллион index'ов. То, что у итераторов нет методов .count() и .index(), - это вообще другой вопрос, да и были бы они, всё равно туфта получилась бы.
Да и видно, что он не в курсе про отладчик, который не видит имена у функций, если они через лямбды присваиваются. Хотел по-умному сделать, да только уши торчат в каждой букве.

Shev
а я бы допилил итератор
Да не, вот эту умную функцию внутри функции ты стопудов бы оставил, ведь она выглядит так умно. А то, что она не тестируется юнит-тестами, ты бы тоже ещё не знал.
Shev
py.user.next
пока этот же код не понадобится в другой программе на другом языке программирования
Другие языки - это слишком далекая перспектива для меня. Пока моя цель - Python. В любом случае, огромное спасибо за помощь!
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB