Форум сайта python.su
есть номера домов
l =
надо отсортировать
как тут ввернуть ключ сортировки?
Офлайн
А так же может быть что-то типа 12/3.
Выделяете дом, дробь, буквенный индекс и сортируете по правилам сортировки многомерных массивов.
Офлайн
эта самая задача уже обсуждалась где-то месяца 2 назад
Офлайн
Я для примера сказал, что это номера домов. У меня дробей никаких нет … а просто буквенный индекс может быть около числа. Городить огород с многомерным списком не хотелось … кажется это неэлегантно. Но попробую. Спасибо.
Офлайн
o7412369815963Вы не вот это имели ввиду? http://python.su/forum/viewtopic.php?id=7412
эта самая задача уже обсуждалась где-то месяца 2 назад
Офлайн
dnikitinнетo7412369815963Вы не вот это имели ввиду? http://python.su/forum/viewtopic.php?id=7412
эта самая задача уже обсуждалась где-то месяца 2 назад
Офлайн
l = ['2', '1a', '11a', '1', '11', '1b', '11c', '11d']
def splitter(str):
number = []
for i in str:
if i.isdigit():
number.append(i)
else:
break
ret = ''.join(number)
return int(ret), str.lstrip(ret)
print sorted(sorted(map(splitter, l), key = lambda x: x[1]), key = lambda x: x[0])
Офлайн
Совсем бы было классно, чтобы без многомерных массивов и прямо в .order_by() например :)
Офлайн
вообще, чтобы не трахать мозг 2йной сортировкой можно переопределить ключ cmp в той же функции sorted(), это не трудно :)
Офлайн
Можно еще и так:
>>> l = ['2', '1a', '11a', '1', '11', '1b', '11c', '11d']
>>> import re
>>> def srt(s):
mo = re.match(r'(\d+)(\w*)', s)
return int(mo.group(1)), mo.group(2)
>>> l.sort(key=srt)
>>> l
['1', '1a', '1b', '2', '11', '11a', '11c', '11d']
Офлайн