2013-10-14 2 views
8

У меня есть список, который состоит из деталей, как это:Сортировка в python - как отсортировать список, содержащий буквенно-цифровые значения?

list1 = ["1", "100A", "342B", "2C", "132", "36", "302F"] 

сейчас, я хочу, чтобы отсортировать этот список, таким образом, что значения в следующем порядке:

list1 = ["1", "2C", "36", "100A", "132", "302F", "342B"] 

Просто делает list1.sort() очевидно не дает правильный ответ - это дает:

list1 = ["1", "100A", "132", "2C", "36", "302F", "342B"] 

Я предполагаю, что это потому, что питон лечит все это как строки напрямую. Тем не менее, я хочу сортировать их на основе их числового значения FIRST, а затем символа, следующего за номером.

Как это сделать?

Спасибо большое :)

+0

Просмотрите это сообщение (http://stackoverflow.com/questions/11850425/custom-python-list-sorting) и определите пользовательскую функцию сравнения. – lurker

+2

Это называется ** натуральный сорт **. возможный дубликат [Есть ли у Python встроенная функция для строковой естественной сортировки?] (http://stackoverflow.com/questions/4836710/does-python-have-a-built-in-function-for-string-natural- sort) –

ответ

11

Вы хотите использовать natural sort:

import re 

_nsre = re.compile('([0-9]+)') 
def natural_sort_key(s): 
    return [int(text) if text.isdigit() else text.lower() 
      for text in re.split(_nsre, s)] 

Пример использования:

>>> list1 = ["1", "100A", "342B", "2C", "132", "36", "302F"] 
>>> list1.sort(key=natural_sort_key) 
>>> list1 
['1', '2C', '36', '100A', '132', '302F', '342B'] 

Это функции путем разбиения элементы в списки, отделяющих из числа и сравнивая их как целые числа вместо строк:

>>> natural_sort_key("100A") 
['', 100, 'a'] 
>>> natural_sort_key("342B") 
['', 342, 'b'] 

Обратите внимание, что это работает только в Python3, если вы всегда сравнивая Интс с Интс и строк со строками, в противном случае вы получите TypeError: unorderable types исключение.

+1

Обратите внимание, что для Python 3 все предметы должны иметь аналогичную структуру. '['a1', '2b']' будет терпеть неудачу с 'TypeError'. –

+0

@StevenRumbalski: ах, я забыл об этом, спасибо. Я расскажу об этом. – Claudiu

0

Ну, вы должны найти способ, чтобы преобразовать ваши строки в числа первых. Например

import re 
def convert(str): 
    return int("".join(re.findall("\d*", str))) 

, а затем использовать его в качестве ключа сортировки:

list1.sort(key=convert) 
+0

Здесь есть несколько вариантов естественного сортирования: http://stackoverflow.com/questions/4836710/does-python-have-a-built-in-function-for-string-natural-sort – nofinator

Смежные вопросы