Уведомления

Группа в Telegram: @pythonsu

#1 Июнь 9, 2010 15:33:54

dnikitin
От:
Зарегистрирован: 2010-06-08
Сообщения: 6
Репутация: +  0  -
Профиль   Отправить e-mail  

Отсортировать номера домов?

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']
МараТ, поясните я не понимаю, почему это работает.

для каждого элемента списка функция srt возвращает кортеж ( digit, letter)

а потом список сортируется с помощью ключа. НО мне не понятно, почему с помощью такого ключа получается нужный результат.

Почему в результате сортировки не может получится что то типа такого
– когда отсортированы только первые элемента кортежа, без учета букв.



Офлайн

#2 Июнь 9, 2010 15:41:05

dnikitin
От:
Зарегистрирован: 2010-06-08
Сообщения: 6
Репутация: +  0  -
Профиль   Отправить e-mail  

Отсортировать номера домов?

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 раза сортировать
Спасибо. Работает.
Правда я так же не понимаю почему при повторной сортировке
списка

по ключу key = lambda x: x

не может получится НЕ правильный порядок.
Например такой 1b, 1a, 2, 11d, 11c
Почему сортировка “по буквам” сохраняется, когда мы сортируем по “числам”



Отредактировано (Июнь 9, 2010 15:42:00)

Офлайн

#3 Июнь 9, 2010 19:10:06

MapaT
От:
Зарегистрирован: 2008-12-07
Сообщения: 13
Репутация: +  0  -
Профиль   Отправить e-mail  

Отсортировать номера домов?

dnikitin
МараТ, поясните я не понимаю, почему это работает.

для каждого элемента списка функция srt возвращает кортеж ( digit, letter)

а потом список сортируется с помощью ключа. НО мне не понятно, почему с помощью такого ключа получается нужный результат.
Потому что сравнение кортежей происходит поэлементно, т.е. сравниваются первые элементы кортежей и если они равны, то сравниваются последующие и т.д.



Офлайн

#4 Июнь 10, 2010 14:29:38

dnikitin
От:
Зарегистрирован: 2010-06-08
Сообщения: 6
Репутация: +  0  -
Профиль   Отправить e-mail  

Отсортировать номера домов?

MapaT
dnikitin
МараТ, поясните я не понимаю, почему это работает.

для каждого элемента списка функция srt возвращает кортеж ( digit, letter)

а потом список сортируется с помощью ключа. НО мне не понятно, почему с помощью такого ключа получается нужный результат.
Потому что сравнение кортежей происходит поэлементно, т.е. сравниваются первые элементы кортежей и если они равны, то сравниваются последующие и т.д.
Ага, понятно. То есть в первом примере можно было просто
sorted(map(splitter, l) – без ключей

А потом список кортежей склеить обратно в список.

А как правильней (читай изящней) склеить

в
список



Офлайн

#5 Июнь 10, 2010 16:46:00

MapaT
От:
Зарегистрирован: 2008-12-07
Сообщения: 13
Репутация: +  0  -
Профиль   Отправить e-mail  

Отсортировать номера домов?

dnikitin
Ага, понятно. То есть в первом примере можно было просто
sorted(map(splitter, l) – без ключей
В первом примере оптимальней сделать так:
print sorted(l, key=splitter)
И не надо будет городить новый список, а затем склеивать его обратно.



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version