Как отсортировать список строк численно?

Я знаю, что это звучит тривиально, но я не понимал, что функция 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.