Как отсортировать список строк численно?
Я знаю, что это звучит тривиально, но я не понимал, что функция 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 и мой учебник не предлагают ничего более или менее полезного, чем функция .sort()
.
Ответы
Ответ 1
Вы на самом деле не конвертировали свои строки в целые. Вернее, вы сделали, но потом ничего не сделали с результатами. То, что вы хотите, это:
list1 = ["1","10","3","22","23","4","2","200"]
list1 = [int(x) for x in list1]
list1.sort()
Если по какой-то причине вам нужно сохранить строки вместо целых (обычно это плохая идея, но, возможно, вам нужно сохранить начальные нули или что-то в этом роде), вы можете использовать ключевую функцию. sort
принимает именованный параметр key
, который является функцией, которая вызывается для каждого элемента перед его сравнением. Возвращаемые значения ключевой функции сравниваются вместо непосредственного сравнения элементов списка:
list1 = ["1","10","3","22","23","4","2","200"]
# call int(x) on each element before comparing it
list1.sort(key=int)
Ответ 2
Вы можете передать функцию параметру key
в метод .sort
. При этом система будет сортировать по ключу (x) вместо x.
list1.sort(key=int)
BTW, чтобы преобразовать список в целые числа навсегда, используйте функцию map
list1 = list(map(int, list1)) # you don't need to call list() in Python 2.x
или понимание списка
list1 = [int(x) for x in list1]
Ответ 3
Если вы хотите использовать функцию sorted()
: sorted(list1, key=int)
Он возвращает новый отсортированный список.
Ответ 4
Сорт Python не странный. Это просто, что этот код:
for item in list1:
item=int(item)
не делает то, что вы считаете, - item
не возвращается обратно в список, он просто отбрасывается.
В любом случае правильным решением является использование key=int
, как показали вам другие.
Ответ 5
Вы также можете использовать:
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..]
Ответ 6
Ответ Seamus Campbell не работает на python2.x.
list1 = sorted(list1, key=lambda e: int(e))
с использованием функции lambda
работает хорошо.
Ответ 7
Попробуйте это, он отсортирует список на месте в порядке убывания (в этом случае нет необходимости указывать ключ):
Процесс
listB = [24, 13, -15, -36, 8, 22, 48, 25, 46, -9]
listC = sorted(listB, reverse=True) # listB remains untouched
print listC
выход:
[48, 46, 25, 24, 22, 13, 8, -9, -15, -36]
Ответ 8
Самое последнее решение правильно. Вы читаете решения как строку, и в этом случае порядок равен 1, затем 100, затем 104, затем 2, затем 21, затем 2001001010, 3 и т.д.
Вместо этого вы должны ЗАПИСАТЬ свой ввод как int:
отсортированные строки:
stringList = (1, 10, 2, 21, 3)
отсортированные ints:
intList = (1, 2, 3, 10, 21)
Чтобы отличить, просто поместите stringList внутри int (blahblah).
Снова:
stringList = (1, 10, 2, 21, 3)
newList = int (stringList)
print newList
=> returns (1, 2, 3, 10, 21)
Ответ 9
Вчера я подошел к той же проблеме и нашел модуль 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']
Ответ 10
Простой способ сортировки числового списка
numlists = [5,50,7,51,87,97,53]
numlists.sort(reverse=False)
print(numlists)
Ответ 11
если вы хотите использовать строку чисел, лучше возьмите другой список, как показано в моем коде, он будет работать нормально.
list1=["1","10","3","22","23","4","2","200"]
k=[]
for item in list1:
k.append(int(item))
k.sort()
print(k)
Ответ 12
Функция сортировки Python3:
if __name__== '__main__':
n = list(input())
print(n)
print(sorted(n))
Ответ 13
scores = ['91','89','87','86','85']
scores.sort()
print (scores)
Это работало для меня, используя версию python 3, хотя это не было в версии 2.