Странное поведение Python при сортировке списка кортежей - PullRequest
0 голосов
/ 10 октября 2019

У меня есть функция, которая выглядит следующим образом:

def f(lst, c):

    scored_vals = []
    for i in lst:
        scored_vals += [(i.value/i.weight, i)]
    scored_vals.sort()

    return scored_vals

Эта функция падает каждый раз, когда достигает scored_vals.sort(). Аргумент lst представляет собой список, состоящий из Item s, где класс Item выглядит следующим образом:

class Item():

    def __init__(self, weight=0, value=0):
        self.weight = weight
        self.value = value

А аргумент c является просто целым числом.

Ниже приведена ошибка:

    scored_vals.sort()
TypeError: '<' not supported between instances of 'Item' and 'Item'

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

lst = [(201.0, Item()), (350.0, Item()), (202.0, Item()), (100.0, Item()), (500.0, Item()), (203.0, Item())]

Затем выполните:

lst.sort()

Не выдает ошибку.

1 Ответ

0 голосов
/ 10 октября 2019

Это из-за метода, который python использует при сортировке кортежей / списков. Если он находит значение, которое эквивалентно, он переходит ко второму значению в кортеже / списке. Это означает, что ошибка произойдет, только если кортежи имеют эквивалентные значения в качестве своего первого индекса. Например, следующее выдаст ошибку:

lst = [(200.0, Item()), (350.0, Item()), (200.0, Item()), (100.0, Item()), (500.0, Item()), (200.0, Item())]
lst.sort()

Но это не будет:

lst = [(201.0, Item()), (350.0, Item()), (202.0, Item()), (100.0, Item()), (500.0, Item()), (203.0, Item())]
lst.sort()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...