списък за сортиране в python

ако имам списък от низове, напр. ["a143.txt", "a9.txt", ] как мога да го сортирам във възходящ ред по числата в списъка, а не по низа. т.е. Искам "a9.txt" да се показва преди "a143.txt" от 9 < 143.

Благодаря.


person Community    schedule 30.03.2011    source източник
comment
Този въпрос изглежда няма нищо общо с scipy или numpy. Ако случаят е такъв, моля, премахнете тези тагове.   -  person JoshAdel    schedule 31.03.2011
comment
Редактирани етикети. Сега е по-ясно.   -  person Maciej Ziarko    schedule 31.03.2011
comment
възможен дубликат на Как сортирате файловете числово?   -  person Daniel DiPaolo    schedule 31.03.2011
comment
Възможен дубликат на Python аналог на функция natsort (сортиране на списък чрез алгоритъм за естествен ред)   -  person tommy.carstensen    schedule 20.03.2017


Отговори (5)


Нарича се „естествен ред на сортиране“, от 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 ) 
person wmil    schedule 30.03.2011
comment
Бих използвал text.lower() в края на реда convert = , за да го направя нечувствителен към главни и малки букви. - person kindall; 31.03.2011
comment
+1. Може да искате да замените ламбда с правилна дефиниция на функция, за четливост. Между другото, номерата на версиите на пакетите на Debian се сравняват горе-долу така. debian.org/doc/debian-policy/ch- controlfields.html#s-f-Version - person ʇsәɹoɈ; 31.03.2011
comment
+1 Добър отговор. Единственото нещо, което не ми хареса, са допълнителните бели полета. Имам предвид тук: [ convert(c) for c in re.split('([0-9]+)', key) ] и l.sort( key=alphanum_key ) и sort_nicely( l ) - person Maciej Ziarko; 31.03.2011
comment
+1, добре направено! Преработих alphanum_key като alphanum_key = lambda key: map(convert, re.split('([0-9]+)', key)). - person PaulMcG; 31.03.2011

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

Вижте http://wiki.python.org/moin/HowTo/Sorting/#Key_Functions за повече информация.

person bradley.ayers    schedule 30.03.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)
person highBandWidth    schedule 30.03.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']
person tokland    schedule 30.03.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)
person Prydie    schedule 30.03.2011
comment
list.sort() е остарял? Обикновено това е по-малко удобно от sorted() е единственото нещо в тази посока, което намерих. Трябва да кажа обаче, че бих бил повече от щастлив да видя сортирането на място да изчезне, но изглежда малко вероятно. - person tokland; 31.03.2011
comment
Не е остарял. docs.python.org/library/stdtypes.html#mutable-sequence- типове - person Maciej Ziarko; 31.03.2011
comment
Може да не е технически амортизиран, но се счита за стар метод и е обозначен като такъв на Python.org. - person Prydie; 31.03.2011
comment
Вярно list.sort() със сигурност е малко по-ефективен за паметта, но разликата е незначителна, що се отнася до списъци с разумен размер. Не мога да намеря добро обяснение защо, но доколкото ми е известно, предпочитаният и по-„питоничен“ начин за извършване на сортиране е използването на sorted(). - person Prydie; 31.03.2011
comment
Казва, че sorted() връща НОВ списък, не че е НОВ. Определено е по-малко ефективно, ако наистина се интересувате от промяна на вашия списък. sorted() е добър за кортежи. - person Maciej Ziarko; 31.03.2011