Уведомления

Группа в Telegram: @pythonsu

#1 Апрель 15, 2010 11:07:53

pochechyev
От:
Зарегистрирован: 2008-02-29
Сообщения: 199
Репутация: +  0  -
Профиль   Отправить e-mail  

Сортировка циферно-символьных значений

Приветствую.

Есть список:
57А, 51, 1, 1/9, 12, 14, 15, 15 к2, 18, 19, 2/4, 22, 22А, 23, 24, 25, 25 к2, 26, 28, 3, 32, 36/34, 37, 38, 40, 41, 42, 43, 44, 45/7 к2, 45/7, 46, 47/8, 48/7, 49, 53А, 55, 59, 59А, 6/3, 7/9, 72, 8/6, 80, 82

Это база домов, ее нужно красиво отсортировать.
т.е. должно быть так
1, 2, ……. 22, 22А, 22А корпус 2 …..


Штатной функцией .sort() получаю полный бардак.

Придумал велосипед - беру элемент, отсекаю в нем символьное значение, преобразую в int и сортирую по нему.
НО, тогда у меня получается где-то так:
22Б, 22, 22А

Некошерно.

В сети найти ничего вразумительного не смог. Много говорят о “натуральной сортировке”, но примеры которые я находил делают тоже самое что и я - преобразование в int и сортировка по числам.

Что посоветуете?


Спасибо.



Офлайн

#2 Апрель 15, 2010 11:48:07

o7412369815963
От:
Зарегистрирован: 2009-06-17
Сообщения: 1986
Репутация: +  32  -
Профиль   Отправить e-mail  

Сортировка циферно-символьных значений

>>> s = '57А, 51, 1, 1/9, 12, 14, 15, 15 к2, 18, 19, 2/4, 22, 22А, 23, 24, 25, 25 к2, 26, 28, 3, 32, 36/34, 37, 38, 40, 41, 42, 43, 44, 45/7 к2, 45/7, 46, 47/8, 48/7, 49, 53А, 55, 59, 59А, 6/3, 7/9, 72, 8/6, 80, 82'
>>> print ', '.join( sorted( map(lambda x:x.strip(),s.split(',') )))
1, 1/9, 12, 14, 15, 15 к2, 18, 19, 2/4, 22, 22А, 23, 24, 25, 25 к2, 26, 28, 3, 32, 36/34, 37, 38, 40, 41, 42, 43, 44, 45/7, 45/7 к2, 46, 47/8, 48/7, 49, 51, 53А, 55, 57А, 59, 59А, 6/3, 7/9, 72, 8/6, 80, 82

Офлайн

#3 Апрель 15, 2010 11:50:17

Dimka665
От:
Зарегистрирован: 2008-09-19
Сообщения: 177
Репутация: +  0  -
Профиль   Отправить e-mail  

Сортировка циферно-символьных значений

o7412369815963
8 получается между 70 и 80.



Офлайн

#4 Апрель 15, 2010 12:01:29

pochechyev
От:
Зарегистрирован: 2008-02-29
Сообщения: 199
Репутация: +  0  -
Профиль   Отправить e-mail  

Сортировка циферно-символьных значений

to o7412369815963:
Спасибо конечно за оперативный ответ, но дом с номером 2/4 находится между 19 и 22.
Вряд ли это можно считать сортировкой.



Офлайн

#5 Апрель 15, 2010 12:13:11

Dimka665
От:
Зарегистрирован: 2008-09-19
Сообщения: 177
Репутация: +  0  -
Профиль   Отправить e-mail  

Сортировка циферно-символьных значений

определять регуляркой номер дома, букву, дробь и сортировать.



Офлайн

#6 Апрель 15, 2010 12:23:54

o7412369815963
От:
Зарегистрирован: 2009-06-17
Сообщения: 1986
Репутация: +  32  -
Профиль   Отправить e-mail  

Сортировка циферно-символьных значений

>>> s = '1, 1/9, 12, 14, 15, 15 к2, 18, 19, 2/4, 22, 22А, 23, 24, 25, 25 к2'
>>> print [x[0]+x[1] for x in sorted(re.findall(r'\s(\d+)(.*?),',s), key = lambda x:int(x[0]) )]
['1/9', '2/4', '12', '14', '15', '15 \xd0\xba2', '18', '19', '22', '22\xd0\x90', '23', '24', '25']

Офлайн

#7 Апрель 15, 2010 12:25:07

o7412369815963
От:
Зарегистрирован: 2009-06-17
Сообщения: 1986
Репутация: +  32  -
Профиль   Отправить e-mail  

Сортировка циферно-символьных значений

Офлайн

#8 Апрель 15, 2010 12:26:18

o7412369815963
От:
Зарегистрирован: 2009-06-17
Сообщения: 1986
Репутация: +  32  -
Профиль   Отправить e-mail  

Сортировка циферно-символьных значений

вот так:

>>> print [x[0]+x[1] for x in sorted(re.findall(r'(\d+)(.*?),',s), key = lambda x:int(x[0]) )]
['1', '1/9', '2/4', '12', '14', '15', '15 \xd0\xba2', '18', '19', '22', '22\xd0\x90', '23', '24', '25']

Офлайн

#9 Апрель 15, 2010 13:00:54

Dimka665
От:
Зарегистрирован: 2008-09-19
Сообщения: 177
Репутация: +  0  -
Профиль   Отправить e-mail  

Сортировка циферно-символьных значений

o7412369815963
вот так:
>>> print [x[0]+x[1] for x in sorted(re.findall(r'(\d+)(.*?),',s), key = lambda x:int(x[0]) )]
['1', '1/9', '2/4', '12', '14', '15', '15 \xd0\xba2', '18', '19', '22', '22\xd0\x90', '23', '24', '25']
неправильно сортирует с буквами.

вот не самый простой и быстрый вариант, но зато работает правильно.
import re

s = "57А, 51, 1, 1/9, 12, 14, 15, 15 к2, 18, 19, 2/4, 22, 22А, 23, 24, 25, 25 к2, 26, 28, 3, 32, 36/34, 37, 38, 40, 41, 42, 43, 44, 45/7 к2, 45/7, 46, 47/8, 48/7, 49, 53А, 55, 59, 59А, 6/3, 7/9, 72, 8/6, 80, 82"

t = s.split(", ")

def compare(dom):
d = re.match(r'(?P<dom>\d+)(?P<letter>[а-яА-Я]*)(?P<after>.*)', dom).groupdict()
return (int(d['dom']), d.get('letter', '').lower() , d.get('after', '').lower())

t.sort(key=compare)

print(t)
>>> ['1', '1/9', '2/4', '3', '6/3', '7/9', '8/6', '12', '14', '15', '15 к2', '18', '19', '22', '22А', '23', '24', '25', '25 к2', '26', '28', '32', '36/34', '37', '38', '40', '41', '42', '43', '44', '45/7', '45/7 к2', '46', '47/8', '48/7', '49', '51', '53А', '55', '57А', '59', '59А', '72', '80', '82']



Офлайн

#10 Апрель 15, 2010 13:05:50

pochechyev
От:
Зарегистрирован: 2008-02-29
Сообщения: 199
Репутация: +  0  -
Профиль   Отправить e-mail  

Сортировка циферно-символьных значений

Всем спасибо за помощь.
to Dimka665 спасибо за решение.
Ушел ботать регекспы.



Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version