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


Я знаю, что это звучит тривиально, но я не учел, что 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 82

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)

Если вы хотите использовать строку из чисел лучше взять другой список, как показано в моем коде он будет работать нормально.

list1=["1","10","3","22","23","4","2","200"]

k=[]

for item in list1:

         k.append(int(item))

k.sort()

print(k)
scores = ['91','89','87','86','85']
scores.sort()
print (scores)

это работало для меня с помощью python версии 3, хотя это не было в версии 2.