ако имам списък от низове, напр. ["a143.txt", "a9.txt", ]
как мога да го сортирам във възходящ ред по числата в списъка, а не по низа. т.е. Искам "a9.txt"
да се показва преди "a143.txt"
от 9 < 143
.
Благодаря.
ако имам списък от низове, напр. ["a143.txt", "a9.txt", ]
как мога да го сортирам във възходящ ред по числата в списъка, а не по низа. т.е. Искам "a9.txt"
да се показва преди "a143.txt"
от 9 < 143
.
Благодаря.
Нарича се „естествен ред на сортиране“, от 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 )
text.lower()
в края на реда convert =
, за да го направя нечувствителен към главни и малки букви.
- person kindall; 31.03.2011
[ convert(c) for c in re.split('([0-9]+)', key) ]
и l.sort( key=alphanum_key )
и sort_nicely( l )
- person Maciej Ziarko; 31.03.2011
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 за повече информация.
Ако искате напълно да пренебрегнете низовете, тогава трябва да го направите
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)
>>> 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']
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)
list.sort()
със сигурност е малко по-ефективен за паметта, но разликата е незначителна, що се отнася до списъци с разумен размер. Не мога да намеря добро обяснение защо, но доколкото ми е известно, предпочитаният и по-„питоничен“ начин за извършване на сортиране е използването на sorted()
.
- person Prydie; 31.03.2011
sorted()
връща НОВ списък, не че е НОВ. Определено е по-малко ефективно, ако наистина се интересувате от промяна на вашия списък. sorted() е добър за кортежи.
- person Maciej Ziarko; 31.03.2011
scipy
илиnumpy
. Ако случаят е такъв, моля, премахнете тези тагове. - person JoshAdel   schedule 31.03.2011