2015-05-29 2 views
2

У меня есть список python с именами файлов следующим образом: [name1, name10, name11, name2, name3, ..., name9].python custom sort list 1/2/3 /../ 9/10

Я хочу, чтобы он был отсортирован как [name1, name2, name3, ..., name10, name11].

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

Я знаю, что могу использовать специальную функцию ключа (sorted(files, key=lambda name: etc.)), но я не уверен, какую функцию применять.

Благодарим за помощь!

+1

дубликат: "Имеют ли Python имеет встроенную функцию для струнного естественного вида" http://stackoverflow.com/questions/4836710/does-python-have-a-built-in-function-for-string-natural-sort – DeepSpace

+2

У вас есть непоследовательные пробелы в именах, они правильные? –

+0

извините, мой плохой. теперь он обновляется. – beta

ответ

2

Если вы ищете лямбда-выражения для использования с функцией sorted и знать, что ваши данные имеют вид «nameXXXXX»:

sorted(names, key=lambda name: int(name[4:])) 
+0

проклятье. вы избили меня до этого;) спасибо! – beta

+1

Ницца! Ну, это самое простое решение, если вы точно знаете, какие ценности вы будете иметь с –

+0

Но этот не будет работать вообще. например, если элемент, содержащий Namea вместо Name.Проверьте сообщение «Внизу» для общего решения. – csharpcoder

2

Что вы ищете, это The alphanum algorithm (иногда также называемый Natural Sort). Связанный мной сайт имеет реализации на нескольких языках, даже один в python.

2
import re 

l = ["name1", "name10", "name 11", "name2"] 
convert = lambda text: int(text) if text.isdigit() else text.lower() 
alphanum_key = lambda key: [ convert(c) for c in re.split('([0-9]+)', key) ] 
print sorted(l, key = alphanum_key) 

Выход: ['name1', 'name2', 'name10', 'name 11']

+0

вы можете использовать 'findall' установку split. –

1

я думаю я понял. дан список [name1, name10, name11, name2, name3, ..., name9]

sorted(list, key = lambda name: int(name[4:])) 

Это полоски 4 символов, потому что name является 4 символов, а затем сортирует по остальным номерам.

3

Попробуйте стороннюю библиотеку для сортировка естественной струны под названием natsort.

>>> import natsort 
>>> my_list = [...] 
>>> natsort.natsorted(my_list) 

Вы также можете указать ключ для сортировки с использованием аргумента key.

>>> natsort.natsorted(my_list, key=lambda x: ...) 
3

Попробуйте:

sorted(aList, key= lambda x: (lambda a, _, b: (a, int(b)) if b.isdigit() else (float("inf"), x))(*x.partition(" "))) 

Это будет работать в соответствии с вашими требованиями. Также не требуется сторонняя библиотека.

1

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

mylist = ['name1', 'name2', 'name3', 'name10', 'name11'] 
sorted_list = [] 

for n in range(100): #this gives you the order 
    for item in mylist: 
     if int(item[4:]) == n: 
      sorted_list.append(item) 

print(sorted_list) 

Он будет:

['name1', 'name2', 'name3', 'name10', 'name11']