сортировка списка в питоне - PullRequest
8 голосов
/ 31 марта 2011

если у меня есть список строк, например ["a143.txt", "a9.txt", ] как я могу отсортировать его в порядке возрастания по номерам в списке, а не по строке. То есть Я хочу, чтобы "a9.txt" появился раньше "a143.txt", поскольку 9 < 143.

спасибо.

Ответы [ 5 ]

13 голосов
/ 31 марта 2011

Это называется "естественный порядок сортировки", От http://www.codinghorror.com/blog/2007/12/sorting-for-humans-natural-sort-order.html

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

import re 

def sort_nicely( l ): 
  """ Sort the given list in the way that humans expect. 
  """ 
  convert = lambda text: int(text) if text.isdigit() else text 
  alphanum_key = lambda key: [ convert(c) for c in re.split('([0-9]+)', key) ] 
  l.sort( key=alphanum_key ) 
0 голосов
/ 31 марта 2011
>>> paths = ["a143.txt", "a9.txt"]
>>> sorted(paths, key=lambda s: int(re.search("\d+", s).group()))
['a9.txt', 'a143.txt']

Более общий, если вы хотите, чтобы он работал и для файлов, таких как: a100_32_12 (и сортировка по числовым группам):

>>> paths = ["a143_2.txt", "a143_1.txt"]
>>> sorted(paths, key=lambda s: map(int, re.findall("\d+", s)))
['a143_1.txt', 'a143_1.txt']
0 голосов
/ 31 марта 2011

list.sort() устарело (см. Python.org How-To ).sorted(list, key=keyfunc) лучше.

import re

def sortFunc(item):
  return int(re.search(r'[a-zA-Z](\d+)', item).group(1))

myList = ["a143.txt", "a9.txt"]

print sorted(myList, key=sortFunc)
0 голосов
/ 31 марта 2011

Если вы хотите полностью игнорировать строки, тогда вы должны сделать

import re
numre = re.compile('[0-9]+')
def extractNum(s):
    return int(numre.search(s).group())

myList = ["a143.txt", "a9.txt", ]
myList.sort(key=extractNum)
0 голосов
/ 31 марта 2011

Используйте list.sort() и предоставьте свою собственную функцию для аргумента key. Ваша функция будет вызываться для каждого элемента в списке (и переданного элемента), и ожидается, что она вернет версию этого элемента, которая будет отсортирована.

См. http://wiki.python.org/moin/HowTo/Sorting/#Key_Functions для получения дополнительной информации.

...