Найти - Пользователи
Полная версия: Помогите отсортировать
Начало » Python для новичков » Помогите отсортировать
1 2 3 4
py.user.next
sergeek
но ведь не гоже благородному дону выполнять работу машины. Вдруг там таких хренек очень много?
prefs вынесено в отдельный этап и задаёт порядок
этот этап совершенно независим, загрузка может проводиться из файла

sergeek
в третьем оказывается убрали аргумент с функцией на сравнение в сортировке
это где убрали ?
>>> print(sorted.__doc__, list.sort.__doc__, sep='\n')
sorted(iterable, key=None, reverse=False) --> new sorted list
L.sort(key=None, reverse=False) -> None -- stable sort *IN PLACE*
>>>

sergeek
v_rezultate = ', '.join([', '.join(sorted(g,key=num_key)) for k,g in groupby(sorted(stroka.split(', '),key=name_key),key=name_key)])
v_rezultate
попробуй сделать import this в интерпретаторе
pyuser
sergeek
но ведь не гоже благородному дону выполнять работу машины. Вдруг там таких хренек очень много?
Если благородный дон проявит инициативу, то он с легкостью найдет топик, в котором обсуждался выбор уникальных значений последовательности с сохранением порядка следования :)
import re
LITERALS = re.compile(r"\D+")
s = 'WTS1234, ACDW485, WTS72, SHR728, ACDW14, SHR16, WTS16'
def _unique(iterable):
    seen = set()
    return (x for x in iterable if x not in seen and not seen.add(x))
out = []
# код py.user.next
for pref in _unique(LITERALS.search(_).group() for _ in s.split(", ")):
    lst = re.findall(pref + r'\d+', s)
    lst.sort(key=lambda i: int(re.search(r'\d+', i).group()))
    out.extend(lst)
sout = ', '.join(out) 
 
print(s)
print(sout)
sergeek
py.user.next
prefs вынесено в отдельный этап и задаёт порядок, этот этап совершенно независим, загрузка может проводиться из файла
порядок неизвестен же. Если бы тсу понадобилось отсортировать 7 элементов он бы наверно сделал это руками. Стало быть велика веротность что таких элементов много или вообще неизвестно. А в таком случае делать часть сортировки вручную неприемлемо
py.user.next
это где убрали ?
это функция для доступа по ключу а не на сравнение. Я про cmp
http://docs.python.org/2/library/functions.html#sorted
http://docs.python.org/3/library/functions.html#sorted
sergeek
def _unique(iterable):
    seen = set()
    return (x for x in iterable if x not in seen and not seen.add(x))
ну это же совсем некрасиво - делать в компрехеншене какие то сайд эффекты
особенно вот это
and not seen.add(x))
то есть должно быть как бы условием по которому генерируется итератор но на самом деле это костыль с помощью которого добавляется элемент в множество чтобы работала первая часть условия.
есть же set comprehension
def _unique(iterable):
    return {x for x in iterable}
pyuser
sergeek
есть же …
Вы не внимательны, необходимо не только отобрать уникальные элементы, но и сохранить порядок следования
sergeek
pyuser
да, но все равно это не изменяет того факта что та конструкция уродлива лучше же добавить 1-2 строки. И повторюсь, про порядок следования у тса ни слова.
А впрочем, может и нужен был этот порядок
py.user.next
pyuser
выбор уникальных значений последовательности с сохранением порядка следования
это откуда взято ?
то, что оно совпало, ещё ни о чём не говорит

sergeek
порядок неизвестен же. Если бы тсу понадобилось отсортировать 7 элементов он бы наверно сделал это руками. Стало быть велика веротность что таких элементов много или вообще неизвестно. А в таком случае делать часть сортировки вручную неприемлемо
не, она конкретно написала, что по буквам оно должно быть отсортировано так, а по числам - по возрастанию
и последовательность эта может браться из файла, который создаётся другим скриптом

sergeek
это функция для доступа по ключу а не на сравнение. Я про cmp
а, ну и правильно, что убрали, - это же очередной эксперимент по типу “что из них больше приживётся”
sergeek
py.user.next
не, она конкретно написала, что по буквам оно должно быть отсортировано так, а по числам - по возрастаниюи последовательность эта может браться из файла, который создаётся другим скриптом
я про то, скорее всего у тса исходная строка побольше, то есть, в
prefs = ('WTS', 'ACDW', 'SHR')
придется добавлять этого руками(если вообще заранее известно что добавлять). Если же она именно такая, тогда уже проще будет написать
def otsortirovat(stroku):
    return "WTS16, WTS72, WTS1234, ACDW14, ACDW485, SHR16, SHR728"
Ну это если оно конечно для какой-то практической цели. Если нет и порядок именно тот (что лишено смысла), то тогда я был не прав, да

dimy44
В принципе, тот уродский код, что я привел, так и сортирует, как тс просил: не трогая сортировку по буквам, группирует их по цифрам. Я тогда внимательно просмотрел начальный и конечный пример и увидел именно такую закономерность: скажем если XWD25 шло раньше AMD11, то сначала будут все XWD, а после все AMD. Нет?
sergeek
dimy44
Нет?
да, только возможно это была случайность И предлагаю закрыть уже тему, так как полные условия задачи от тса получены не были, а гадать не стоит.
уродский код
зря недооцениваешь (или показываешь что недооцениваешь) себя, по мне он как раз таки самый правильный. Зря все таки убрали cmp, не городить же классы или то что у меня ради такой вот сортировки.
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