2013-07-12 4 views
2

я следующий список:Каков наилучший способ сортировки этого списка?

my_list = ['name.13','name.1', 'name.2','name.4', 'name.32'] 

И я хотел бы отсортировать список и распечатать его в порядке, как этот

name.1 
name.2 
name.4 
name.13 
name.32 

То, что я пытался до сих пор:

print sorted(my_list) 

name.1 
name.13 
name.2 
name.32 
name.4 

Команда sorted() явно обрабатывает строку в алфавитном порядке. Может быть, лучше отсортировать численно после обнаружения .?

Есть ли способ сортировки правильно? Каким будет наиболее эффективный подход? Как я могу применить это, я имел список кортежей и хотел сортировать его, используя второй элемент кортежей? Например:

tuple_list = [('i','name.2'),('t','name.13'),('s','name.32'),('l','name.1'),('s','name.4')] 

print tuple_list 
'l','name.1' 
'i','name.2' 
's','name.4' 
't','name.13' 
's','name.32' 

Спасибо за вашу помощь и, как всегда, комментарий, если вы думаете, что вопрос может быть улучшены/выяснено.

Alex

+1

Является ли текст до периода всегда одинаковым (например, «имя»)? Если нет, как вы хотите сортировать элементы с разными именами? –

+0

Текст всегда «имя». а затем номер – user1083734

+0

возможный дубликат [Как сортировать буквенный набор в python] (http://stackoverflow.com/questions/2669059/how-to-sort-alpha-numeric-set-in-python) – tamasgal

ответ

8

Вы можете попробовать его так же, как this ответ:

>>> my_list = ['name.13','name.1', 'name.2','name.4', 'name.32'] 
>>> sorted(my_list, key=lambda a: (int(a.split('.')[1]))) 
['name.1', 'name.2', 'name.4', 'name.13', 'name.32'] 

Или с кортежей:

>>> tuple_list = [('i','name.2'),('t','name.13'),('s','name.32'),('l','name.1'),('s','name.4')] 
>>> sorted(tuple_list, key=lambda (a,b): (int(b.split('.')[1]))) 
[('l', 'name.1'), ('i', 'name.2'), ('s', 'name.4'), ('t', 'name.13'), ('s', 'name.32')] 

Edit, чтобы объяснить, что это делает:

Пример передает лямбда функция до sorted, которая разбивает строки, а затем преобразует вторую часть t o целое число. Затем sorted использует это целое число для сортировки элементов списка.

Этот пример полностью игнорирует строки слева от точки при сортировке. Пожалуйста, дайте мне знать, если вам также нужно сортировать по первой части.

+0

Это классное решение! Спасибо - как это было бы приспособлено, чтобы справиться со списком кортежей, размещенным в вопросе редактирования? – user1083734

+0

Я обновил ответ. – jeyk

+0

Это отлично поработало, спасибо! : D – user1083734

3

Попробуйте это:

sorted(my_list, key=lambda x: int(x.split('.')[1])) 

Демо:

>>> my_list = ['name.13','name.1', 'name.2','name.4', 'name.32'] 
>>> sorted(my_list, key=lambda x: int(x.split('.')[1])) 
['name.1', 'name.2', 'name.4', 'name.13', 'name.32'] 
>>> 

Расширение его кортежа,

sorted(tuple_list, key = lambda x: int(x[1].split('.')[1])) 

DEMO:

>>> sorted(tuple_list, key = lambda x: int(x[1].split('.')[1])) 
[('l', 'name.1'), ('i', 'name.2'), ('s', 'name.4'), ('t', 'name.13'), ('s', 'name.32')] 
+0

почему сортировать на месте? – inspectorG4dget

+0

что в этом плохого? – karthikr

+2

@karthikr Он не сортирует численно в соответствии с вопросом. –

3

Это один использует больше памяти, но не расщепляется каждый запись несколько раз:

from operator import itemgetter 
my_list = ['name.13','name.1', 'name.2','name.4', 'name.32'] 
my_nlist= [ (int(n.split('.')[1]), i) for i,n in enumerate(my_list)] 
my_list = [ my_list[t[1]] for t in sorted(my_nlist, key=itemgetter(0))] 

для решения кортежей:

my_list = [('i','name.2'),('t','name.13'), 
      ('s','name.32'),('l','name.1'),('s','name.4')] 
my_nlist= [ (int(n[1].split('.')[1]), i) for i,n in enumerate(my_list)] 
my_list = [ my_list[t[1]] for t in sorted(my_nlist, key=itemgetter(0))] 
+0

Интересный подход, как бы он справился со списком кортежей в вопросе редактирования? – user1083734

3

ОБНОВЛЕНО ОТВЕТ

По natsort версии 4.0 ,0, это работает из коробки без указания каких-либо опций:

>>> import natsort 
>>> my_list = ['name.13','name.1', 'name.2','name.4', 'name.32'] 
>>> natsort.natsorted(my_list) 
['name.1','name.2', 'name.4','name.13', 'name.32'] 

OLD ОТВЕТ для natsort < 4.0.0

Если вы не против внешних пакетов, попробуйте natsort пакет (версия> = 3.0.0):

>>> import natsort 
>>> my_list = ['name.13','name.1', 'name.2','name.4', 'name.32'] 
>>> natsort.natsorted(my_list, number_type=int) 
['name.1','name.2', 'name.4','name.13', 'name.32'] 

number_type аргумент необходимо в этом потому что natsort по умолчанию ищет поплавки, а десятичная точка сделает все эти числа интерпретированными как float.


Полное описание: Я являюсь автором natsort.

+0

Я не возражаю, это очень полезно! Поэтому, чтобы справиться со списком кортежей, я бы сделал 'natsort.natsorted (my_list [1])'? – user1083734

+0

Это круто, я не знал этого пакета – jeyk

+0

Я рад, что вам понравилось! Да, это должно работать для списка кортежей. – SethMMorton

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