Я знаю, что это звучит банально, но я не осознавал, что 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()
функция.
list1
. Что заставило вас подумать,list
что идет обновление?sorted(mylist)
Ответы:
Вы фактически не преобразовали свои строки в целые числа. Вернее, сделали, но потом ничего не сделали с результатами. Вы хотите:
Если по какой-то причине вам нужно сохранить строки вместо целых чисел (обычно это плохая идея, но, возможно, вам нужно сохранить ведущие нули или что-то еще), вы можете использовать ключевую функцию.
sort
принимает именованный параметр,key
который является функцией, вызываемой для каждого элемента перед его сравнением. Вместо прямого сравнения элементов списка сравниваются возвращаемые значения ключевой функции:источник
list1 = list1.sort(key=int)
, используйте толькоlist1.sort(key=int)
и list1 уже будет отсортирован.Вы можете передать функцию в
key
параметра в.sort
методе . При этом система будет отсортировать по ключу (x) вместо x.Кстати, для преобразования списка в целые числа постоянно, использовать в
map
функциюили понимание списка
источник
Если вы хотите использовать
sorted()
функцию:sorted(list1, key=int)
Он возвращает новый отсортированный список.
источник
Сортировка в Python не такая уж странная. Просто этот код:
не делает то, что вы думаете -
item
не заменяется обратно в список, а просто выбрасывается.В любом случае, правильное решение - использовать то,
key=int
что вам показали другие.источник
Вы также можете использовать:
Это очень похоже на другие вещи, которые вы можете найти в Интернете, но также работает для буквенно-цифровых символов, таких как
[abc0.1, abc0.2, ...]
.источник
Вчера я подошел к той же проблеме и нашел модуль под названием [natsort] [1], который решает вашу проблему. Использование:
Он также работает со словарями как эквивалент
sorted
. [1]: https://pypi.org/project/natsort/источник
Ответ Симуса Кэмпбелла не работает на 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)
отсортированные целые числа:
intList = (1, 2, 3, 10, 21)
Для преобразования просто поместите stringList в int (blahblah).
Очередной раз:
источник
Если вы хотите использовать строки чисел, лучше возьмите другой список, как показано в моем коде, он будет работать нормально.
источник
Простой способ отсортировать числовой список
источник
настоящая проблема в том, что сортировка сортирует вещи по алфавиту. Итак, если у вас есть список ['1', '2', '10', '19'] и вы запустите sort, вы получите ['1', '10'. «19», «2»]. т.е. 10 идет до 2, потому что он смотрит на первый символ и сортирует, начиная с него. Кажется, что большинство методов в python возвращают вещи именно в таком порядке. Например, если у вас есть каталог с именем abc с файлами, помеченными как 1.jpg, 2.jpg и т. Д., Скажем, до 15.jpg, и вы выполняете file_list = os.listdir (abc), file_list упорядочен не так, как вы ожидаете, а как file_list = ['1.jpg', '11 .jpg '---' 15.jpg ',' 2.jpg]. Если порядок, в котором обрабатываются файлы, важен (вероятно, поэтому вы назвали их численно), он не такой, как вы думаете. Вы можете избежать этого, используя заполнение "нулями". Например, если у вас есть список alist = ['01', '03', '05', '10', '02', '04', '06] и вы запускаете по нему сортировку, вы получаете желаемый порядок. alist = ['01', '02' и т. д.], потому что первый символ - это 0, который стоит перед 1. Количество нулей, которые вам нужно заполнить, определяется наибольшим значением в списке. Например, если наибольшее значение находится в диапазоне от 100 до 1000 вам нужно заполнить однозначными числами 001, 002 --- 010011-100, 101 и т. Д.
источник
Это сработало для меня с использованием Python версии 3, но не с версией 2.
источник