2015-07-20 4 views
0

У меня возникла проблема с сортировкой списка в Python. По какой-то причине он оценивает список по наивысшему значению, но после этого процесса другие элементы в этом списке больше не сортируются.Сортировка списков на основе первого целого числа

Мой код:

import csv 

id_list = [] 

with open('source/to/file/output.csv', 'rt') as f: 
    reader = csv.reader(f, delimiter=',', quotechar='"') 
    for row in reader: 
     test = "177" 
     if test == row[0]: 
      id_list.append([row[2],row[1]])    

generated_list = id_list[0], id_list[16], id_list[20] 

print(generated_list) 
print(sorted(generated_list)) 

Результат печати является:

-- (['17', '179'], ['5', '2641'], ['9', '3705']) # not sorted 
-- [['17', '179'], ['5', '2641'], ['9', '3705']] # sorted 

То, что я бы ожидать, что метод сортировки будет выводить:

-- [['17', '179'], ['9', '3705'], ['5', '2641']] # sorted 

Могу ли я делать что-то не так?

+2

Почему вы ожидали этого? Python ** строго типизирован **, он не будет рассматривать строки как числа. См. http://stackoverflow.com/q/4836710/3001761 для некоторых альтернатив. – jonrsharpe

ответ

3

Python сортировать свои списки на основе первого элемента lexicographicaly, потому что у вас есть строка, для получить поездку на что использовать ключевую функцию для сортировки на основе int значения:

print(sorted(generated_list,key=lambda x:int(x[0]),reverse=True)) 

Демо:

>>> sorted(generated_list,key=lambda x:int(x[0]),reverse=True) 
[['17', '179'], ['9', '3705'], ['5', '2641']] 

Или, как говорится в комментарии, вы можете преобразовать свой номер в целое число перед сортировкой, также вы можете распаковать свои строки для отказа от нескольких индексирования:

with open('source/to/file/output.csv', 'rt') as f: 
    reader = csv.reader(f, delimiter=',', quotechar='"') 
    for row in reader: 
     test = "177" 
     row1,row2,row3=row 
     if test == row1: 
      id_list.append([int(row2),row(row1)]) 
+0

О, это потрясающе! Спасибо огромное! Это сделал трюк! Как только я смогу отметить вас, я это сделаю! – Rotan075

+1

Предполагая, что OP хочет работать с этими данными, возможно, было бы лучше постоянно преобразовывать значения в 'int'. –

+0

@tobias_k Да, это было бы лучше! – Kasramvd

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