Форум сайта python.su
MapaTМараТ, поясните я не понимаю, почему это работает.
Можно еще и так:>>> 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']
Офлайн
ZubchickСпасибо. Работает.вроде работает :)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])
Пришлось правда 2 раза сортировать
Отредактировано (Июнь 9, 2010 15:42:00)
Офлайн
dnikitinПотому что сравнение кортежей происходит поэлементно, т.е. сравниваются первые элементы кортежей и если они равны, то сравниваются последующие и т.д.
МараТ, поясните я не понимаю, почему это работает.
для каждого элемента списка функция srt возвращает кортеж ( digit, letter)
а потом список сортируется с помощью ключа. НО мне не понятно, почему с помощью такого ключа получается нужный результат.
Офлайн
MapaTАга, понятно. То есть в первом примере можно было простоdnikitinПотому что сравнение кортежей происходит поэлементно, т.е. сравниваются первые элементы кортежей и если они равны, то сравниваются последующие и т.д.
МараТ, поясните я не понимаю, почему это работает.
для каждого элемента списка функция srt возвращает кортеж ( digit, letter)
а потом список сортируется с помощью ключа. НО мне не понятно, почему с помощью такого ключа получается нужный результат.
Офлайн
dnikitinВ первом примере оптимальней сделать так:
Ага, понятно. То есть в первом примере можно было просто
sorted(map(splitter, l) – без ключей
print sorted(l, key=splitter)
Офлайн