Сравните, если один кортеж больше при смешивании типов `str` и` None` в Python - PullRequest
0 голосов
/ 16 ноября 2018

У меня есть два списка кортежей, которые имеют сочетание типов str и None, и мне нужно сравнить их, считая None больше.

a = tuple([None, 4])
b = tuple(['pencil', 12])

a > b 

Результаты:

TypeError: '>' не поддерживается между экземплярами 'NoneType' и 'str'

Как я могусравнить эти элементы без этой ошибки?

Ответы [ 2 ]

0 голосов
/ 16 ноября 2018

Вы также можете создать подкласс tuple и создать свой собственный класс кортежей с соответствующим образом реализованными методами __lt__ и __gt__:

class MyTuple(tuple):
    def __lt__(self, other):
        for s, o in zip(self, other):
            if s == o:
                continue
            if s is None:
                return False
            if o is None:
                return True
        return super().__lt__(other)

    def __gt__(self, other):
        return not self.__lt__(other)


a = MyTuple([None, 4])
b = MyTuple(['pencil', 12])

print(a < b) # False
print(a > b) # True
0 голосов
/ 16 ноября 2018

Вы можете заменить item > item2 такой функцией:

def compare_tuples(item1, item2):
    try:
        return item1 > item2
        # if they can be compared, just do so directly
    except TypeError:
        for field1, field2 in zip(item1, item2):
            # otherwise go through the fields in the tuples 
            # and compare them checking if they are none
            if field1 == field2:
                continue
            if field1 is None:
                return True
            if field2 is None:
                return False
...