У меня есть список содержит строки и числа с плавающей запятой, как сортировать числа по убыванию и распечатать список на стандартный вывод - PullRequest
0 голосов
/ 27 апреля 2018

У меня есть список ниже:

mylist = [('Jim', 0.745), ('James', 0.812), ('Charlie', 0.752), ('Henry', 0.694), ('Minnie', 0.693), (None,)]

и я хотел бы отсортировать заказ по номеру и вернуться к:

my_list = [('James', 0.812), ('Charlie', 0.752), ('Jim', 0.745), ('Henry', 0.694), ('Minnie', 0.693), (None,)]

и напечатайте my_list как стандартный вывод:

james 0.812
Charlie 0.752
Jim 0.745
Henry 0.694
Minnie 0.693
None 

Я пытался сортировать по:

my_list = sorted(mylist, key=lambda x:(x[1]), reverse=True)

Но это показывает TupleError: tuple index out of range

что я должен сделать, чтобы исправить просто использование списка, чтобы сделать еще один цикл для достижения этого? Благодарю.

Ответы [ 2 ]

0 голосов
/ 27 апреля 2018

Ваш последний кортеж не имеет двух элементов. Используйте функцию пользовательской клавиши:

def key(item):
    if len(item) == 2:
        return item[1]
    else:
        return 0

sorted(mylist, key=key, reverse=True)

Выход:

[('James', 0.812), ('Charlie', 0.752), ('Jim', 0.745), ('Henry', 0.694), ('Minnie', 0.693), (None,)]
0 голосов
/ 27 апреля 2018

Вы можете включить длину кортежа в логику сортировки.

Суть в том, что ваш lambda может вернуть кортеж, который Python естественным образом сортирует последовательно. Тогда вы можете print через простой цикл for.

res = sorted(mylist, key=lambda x: (-len(x), -x[1] if len(x) > 1 else float('-inf')))

for i in res:
    print(' '.join(list(map(str, i))))

Результат:

James 0.812
Charlie 0.752
Jim 0.745
Henry 0.694
Minnie 0.693
None

Вдохновленный juanpa.arrivillaga, предложение try / except является хорошим вариантом для обработки редких исключений:

def sorter(x):
    try:
        return x[1]
    except IndexError:
        return float('-inf')

res = sorted(mylist, key=sorter, reverse=True)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...