Неупорядоченные типы: str ()> float () в при фильтрации выражения генератора - PullRequest
1 голос
/ 09 марта 2019

Мой код работал отлично все время, и внезапно появляется эта ошибка:

unorderable types: str() > float() 

enter image description here

Я извлекаю книгу заказов через API и затем хочу получить все заказы с суммой, превышающей 1.

filtermaxxamount = (x for x in dic if x['max_amount'] > 1)

Похоже, это класс "генератора". Затем я хочу извлечь самую высокую цену из filtermaxxamount с помощью:

highestprice = ((max((x for x in filtermaxxamount if x['min_amount'] < 1), 
                     key=lambda x:x['price']))['price'])

После этого я получаю ошибку, упомянутую выше. До этого все работало хорошо, и у меня не было проблем. API не изменился. Я проверил это на сайте.

Какая у меня ошибка? В чем проблема? Это должен быть словарь вместо генератора, верно?

1 Ответ

1 голос
/ 09 марта 2019

Вы, кажется, перешли с Python 2 на Python 3.

В Python 2 все type с были заказаны:

print(sorted( [1,"2",3,"None"]`))  
# Output: [1,3,'2','None'] 

В Python 3 это уже не так:

print(sorted( [1,"2",3,"None"]`))  
# TypeError: '<' not supported between instances of 'str' and 'int' 

# workaround for sorting: use an explicit key function
print(sorted( [1,"2",3,"None"], key=lambda x: 999999999999 if isinstance(x,str) else x))

См. Почему исправлен порядок типов в Python 2 и неупорядоченная ошибка TypeError в Python 3?


Чтобы исправить вашу проблему: (и причину, по которой я ответил, в дополнение к предложению обмана)

Отфильтруйте элементы к тем, которые имеют значение с плавающей запятой и не являются строкой:

l = [ {'max_amount' : 33.0}, {'max_amount' : -33.0}, {'max_amount' : 12.6},
      {'max_amount' : "None"}, {'max_amount' : "34"}]

try:
    # only look at those that are floats (seperated for clarity)
    filter_float = (x for x in l if isinstance(x['max_amount'],float))

    # from those filter the > 1 ones
    filtermaxxamount = (x for x in filter_float if x['max_amount'] > 1)

    # creates an error:
    # filtermaxxamount = (x for x in l if x['max_amount'] > 1)
    print(*filtermaxxamount) 
except TypeError as e:
    print(e)  # never reached unless you uncomment # filtermaxxamount = (x for x in l ...

Выход:

{'max_amount': 33.0} {'max_amount': 12.6}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...