Как отсортировать список строк численно? - PullRequest
104 голосов
/ 06 августа 2010

Я знаю, что это звучит тривиально, но я не осознавал, что функция sort() в Python была странной. У меня есть список «чисел», которые на самом деле представлены в виде строки, поэтому я сначала преобразовываю их в целые, а затем пытаюсь выполнить сортировку.

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().

Ответы [ 13 ]

172 голосов
/ 06 августа 2010

Вы на самом деле не конвертировали свои строки в целые.Вернее, вы сделали, но потом ничего не сделали с результатами.То, что вы хотите:

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)
36 голосов
/ 06 августа 2010

Вы можете передать функцию в параметр key в метод .sort .При этом система будет сортировать по ключу (x) вместо x.

list1.sort(key=int)

Кстати, чтобы постоянно преобразовывать список в целые числа, используйте функцию map

list1 = list(map(int, list1))   # you don't need to call list() in Python 2.x

или понимание списка

list1 = [int(x) for x in list1]
17 голосов
/ 28 декабря 2012

Если вы хотите использовать функцию sorted(): sorted(list1, key=int)

Возвращает новый отсортированный список.

12 голосов
/ 06 августа 2010

Питон не такой странный.Просто этот код:

for item in list1:
   item=int(item)

не делает то, о чем вы думаете - item не возвращается обратно в список, он просто выбрасывается.

В любом случае,правильное решение - использовать key=int, как вам показали другие.

8 голосов
/ 14 октября 2016

Вы также можете использовать:

 
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 голосов
/ 22 апреля 2017

Seamus Campbell ответ не работает на python2.x.
list1 = sorted(list1, key=lambda e: int(e)) с использованием функции lambda работает хорошо

3 голосов
/ 13 октября 2018

Попробуйте, это отсортирует список на месте в порядке убывания (в этом случае нет необходимости указывать ключ):

Процесс

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]
2 голосов
/ 23 мая 2018

Я подошел к той же проблеме вчера и нашел модуль с именем 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']
1 голос
/ 04 сентября 2018

Простой способ сортировки числового списка

    numlists = [5,50,7,51,87,97,53]
    numlists.sort(reverse=False)
    print(numlists)
1 голос
/ 06 декабря 2013

Последнее решение верное.Вы читаете решения в виде строки, и в этом случае порядок равен 1, затем 100, затем 104, затем 2, затем 21, затем 2001001010, 3 и т. Д.

Вы должны ЗАКАЧИТЬ свой ввод как intвместо:

отсортированные строки:

stringList = (1, 10, 2, 21, 3)

отсортированные целые числа:

intList = (1, 2, 3, 10, 21)

Чтобы разыграть, просто поместитеstringList внутри int (вздор).

Снова:

stringList = (1, 10, 2, 21, 3)

newList = int (stringList)

print newList

=> returns (1, 2, 3, 10, 21) 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...