Найти - Пользователи
Полная версия: Сортировка циферно-символьных значений
Начало » Python для новичков » Сортировка циферно-символьных значений
1 2
pochechyev
Приветствую.

Есть список:
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 и сортировка по числам.

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


Спасибо.
o7412369815963
>>> 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
Dimka665
o7412369815963
8 получается между 70 и 80.
pochechyev
to o7412369815963:
Спасибо конечно за оперативный ответ, но дом с номером 2/4 находится между 19 и 22.
Вряд ли это можно считать сортировкой.
Dimka665
определять регуляркой номер дома, букву, дробь и сортировать.
o7412369815963
>>> 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']
o7412369815963
первый дом тока выпал
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']
Dimka665
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']
pochechyev
Всем спасибо за помощь.
to Dimka665 спасибо за решение.
Ушел ботать регекспы.
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