2010-08-06 6 views
69

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

+7

Обратите внимание, что ваш цикл for не делает то, что я подозреваю, что вы так думаете. – deinst

+1

Ни в коем случае вы не обновили 'list1'. Что заставило вас думать, что «список» обновляется? –

+0

Аналогичная проблема возникает, когда в качестве входных данных предоставляется список1 = ['1', '1.10', '1.11', '1.1', '1.2']. Вместо того, чтобы получать выходные данные как ['1', '1.1', '1.2', '1.10', '1.11'], я получаю ['1', '1.1', '1.10', '1.11', '1.2' ] – sathish

ответ

127

Вы на самом деле не конвертируются свои строки в Интс. Вернее, вы это сделали, но тогда вы ничего не сделали с результатами. Чего вы хотите:

list1 = ["1","10","3","22","23","4","2","200"] 
list1 = [int(x) for x in list1] 
list1.sort() 

Однако питон делает его еще проще: вроде принимает именованный параметр, ключ, который является функцией, которая вызывается на каждый элемент перед сравнением (но без изменения списка)

list1 = ["1","10","3","22","23","4","2","200"] 
# call int(x) on each element before comparing it 
list1.sort(key=int) 
+6

когда я пытаюсь key = int в 2.7 Я получаю None – KI4JGT

+0

@ KI4JGT: Он отлично работает с Python 3.3.2. – dfernan

+0

Это работает, если элемент списка хранится как «целое число», как обрабатываться в случае значений float? Например, list1 = [1, 1.10, 1.11, 1.1, 1.2] – sathish

28

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

list1.sort(key=int) 

BTW, чтобы преобразовать список в целых постоянно, используйте the map function

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

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

list1 = [int(x) for x in list1] 
8

Тип Python не является странным. Это просто, что этот код:

for item in list1: 
    item=int(item) 

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

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

+0

О, это хороший момент! Спасибо! – Brian

13

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

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

-1

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

Вы должны CAST ввода как межды вместо:

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

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

отсортированных Интсы:

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) 
+0

ТипError: аргумент int() должен быть строкой или числом, а не 'tuple' –

+0

Кроме того, строки в строковом списке должны иметь кавычки. – Teepeemm

+1

Это предсказание helluva, чтобы сделать: «самое последнее решение правильно»;) – GreenAsJade

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

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

+0

Попробуйте сортировать с '11 и '100' там, вот когда все становится интересным. – Penz

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 ..]

3

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

Смежные вопросы