Почему я не получаю результат отсортированной функции в ожидаемом порядке? - PullRequest
0 голосов
/ 17 октября 2011
print activities
activities  = sorted(activities,key = lambda item:item[1])
print activities

Деятельности в этом случае представляют собой список кортежей, подобных (start_number,finish_number). Вывод приведенного выше кода, по моему мнению, должен быть списком значений, отсортированных в порядке возрастания finish_number.Когда я попробовал приведенный выше код в оболочке, я получил следующий вывод.Я не уверен, почему второй список не отсортирован в порядке возрастания finish_number.Пожалуйста, помогите мне понять это.

[('1', '4'), ('3', '5'), ('0', '6'), ('5', '7'), ('3', '9'), ('5', '9'), ('6', '10'), ('8', '11'), ('8', '12'), ('2', '14'), ('12', '16')]
[('6', '10'), ('8', '11'), ('8', '12'), ('2', '14'), ('12', '16'), ('1', '4'), ('3', '5'), ('0', '6'), ('5', '7'), ('3', '9'), ('5', '9')]

Ответы [ 5 ]

6 голосов
/ 17 октября 2011

Ваши предметы сравниваются как строки, а не числа. Таким образом, поскольку символ 1 стоит перед лексикографически перед 4, имеет смысл, что 10 предшествует 4.

Сначала вам нужно привести значение к типу int:

activities  = sorted(activities,key = lambda item:int(item[1]))
6 голосов
/ 17 октября 2011

Вы сортируете строки вместо целых чисел: в этом случае 10 «меньше», чем 4.Чтобы отсортировать по целым числам, конвертируйте его в следующее:

activites = sorted(activities,key = lambda item:int(item[1]))
print activities

Результат:

[('1', '4'), ('3', '5'), ('0', '6'), ('5', '7'), ('3', '9'), ('5', '9'), ('6', '10'), ('8', '11'), ('8', '12'), ('2', '14'), ('12', '16')]
2 голосов
/ 17 октября 2011

Вы сортируете строки, а не числа. Строки сортируются символ за символом.

Так, например, '40' больше '100', потому что символ 4 больше 1.

Вы можете исправить это на лету, просто приведя элемент к целому числу.

 activities  = sorted(activities,key = lambda item: int(item[1]))
1 голос
/ 18 октября 2011

Ищите решение BROADER для вашей проблемы : преобразуйте ваши данные из str в int сразу после ввода, работайте с ним как int (иначе вы будете постоянно сталкиваться с небольшие проблемы вроде этого), и отформатируйте ваши данные как str для вывода.

Этот принцип применяется в целом, например, при работе со строковыми данными, не относящимися к ASCII, выполните UTF-8 -> unicode -> UTF-8; не пытайтесь манипулировать не декодированным текстом.

1 голос
/ 17 октября 2011

Это потому, что вы храните число не как число, а как строку. Строка '10' стоит перед строкой '2'. Попробуйте:

activities = sorted(activities, key=lambda i: int(i[1]))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...