Как отсортировать список численно?
Я знаю, что это звучит тривиально, но я не учел, что sort()
функция Python была странной. У меня есть список "чисел", которые на самом деле находятся в Строковой форме, поэтому я сначала конвертирую их в ints, а затем пытаюсь сортировать.
list1=["1","10","3","22","23","4","2","200"]
for item in list1:
item=int(item)
list1.sort()
print list1
дает мне:
['1', '10', '2', '200', '22', '23', '3', '4']
Я хочу
['1','2','3','4','10','22','23','200']
Я искал некоторые алгоритмы, связанные с сортировкой числовых наборов, но те, которые я нашел, все включают сортировку буквенно-цифровых наборов.
Я знаю, что это, вероятно, не проблема, но google и мой учебник не предлагают ничего более или менее полезного, чем
11 ответов:
вы на самом деле не преобразовали свои строки в ints. Или, скорее, вы сделали, но тогда вы ничего не сделали с результатами. То, что вы хотите:
list1 = ["1","10","3","22","23","4","2","200"] list1 = [int(x) for x in list1] list1.sort()
однако python делает это еще проще для вас: сортировка принимает именованный параметр, ключ, который является функцией, вызываемой для каждого элемента перед его сравнением (но без изменения списка)
list1 = ["1","10","3","22","23","4","2","200"] # call int(x) on each element before comparing it list1.sort(key=int)
вы можете передать функцию до the
.sort
метод. При этом система будет сортировать по ключу (x) вместо x.list1.sort(key=int)
кстати, чтобы преобразовать список в целые числа постоянно, используйте the
map
функцииlist1 = list(map(int, list1)) # you don't need to call list() in Python 2.x
или список осмысления
list1 = [int(x) for x in list1]
в случае, если вы хотите использовать
sorted()
функция:sorted(list1, key=int)
он возвращает новый отсортированный список.
вид питона не странно. Просто этот код:
for item in list1: item=int(item)
не делает то, что вы думаете, что это -
item
не заменяется обратно в список,он просто выбрасывается.В любом случае, правильное решение-использовать
key=int
как другие показали вы.
вы также можете использовать:
import re def sort_human(l): convert = lambda text: float(text) if text.isdigit() else text alphanum = lambda key: [ convert(c) for c in re.split('([-+]?[0-9]*\.?[0-9]*)', key) ] l.sort( key=alphanum ) return l
это очень похоже на другие вещи, которые вы можете найти в интернете, но также работает для буквенно-цифровых символов, таких как [abc0.1, abc0.2..]
Шеймус Кэмпбеллответ не работает на python2.x.
list1 = sorted(list1, key=lambda e: int(e))
используяlambda
функция работает хорошо.
последнее решение является правильным. Вы читаете решения в виде строки, в этом случае порядок равен 1, затем 100, затем 104, затем 2, затем 21, затем 2001001010, 3 и так далее.
вместо этого вы должны ввести свой ввод как int:
отсортированных строк:
stringList = (1, 10, 2, 21, 3)
сортировка ints:
intList = (1, 2, 3, 10, 21)
чтобы бросить, просто поместите список строк внутри int (blahblah ).
еще раз:
stringList = (1, 10, 2, 21, 3) newList = int (stringList) print newList => returns (1, 2, 3, 10, 21)
Я подошел к той же проблеме вчера и нашел модуль под названием
natsort
который решает проблемы. Использование:from natsort import natsorted # Example list of strings a = ['1', '10', '2', '3', '11'] [In] sorted(a) [Out] ['1', '10', '11', '2', '3'] [In] natsorted(a) [Out] ['1', '2', '3', '10', '11']
простой способ сортировки числового списка
numlists = [5,50,7,51,87,97,53] numlists.sort(reverse=False) print(numlists)