Объекты просмотра словаря Python 3.x и matplotlib

В python 3.x keys() , values() и items() возвращают представления . Теперь, когда мнения, безусловно, имеют преимущества , они также, похоже, вызывают некоторые проблемы совместимости. Например, с matplotlib (в конечном счете это с numpy ). В качестве примера этот и этот ответы на вопросы stackexchange работают очень хорошо с python 2.x, но поднимают Exception при выполнении их в python 3.4.

Минимальный пример:

 import matplotlib.pyplot as plt d = {1: 2, 2: 10} plt.scatter(d.keys(), d.values()) 

Что вызывает TypeError: float() argument must be a string or a number, not 'dict_values' с python 3.4.

Хотя для минимального примера исключение совершенно ясное, этот вопрос возникает из-за одной и той же проблемы, и здесь исключение намного менее понятно TypeError: ufunc 'isfinite' not supported for the input types, and the inputs could not be safely coerced to any supported types according to the casting rule ''safe''

Какова наилучшая практика для решения этой проблемы? Можем ли мы надеяться, что в новой версии matplotlib (или, в конечном счете, numpy ) эта проблема будет matplotlib или мы должны начать писать такие вещи, как list(dict.values()) при использовании matplotlib чтобы быть уверенным, что не matplotlib с трудностями с python 3.x?

One Solution collect form web for “Объекты просмотра словаря Python 3.x и matplotlib”

Больше этой ошибки:

 --> 512 return array(a, dtype, copy=False, order=order, subok=True) 513 514 def ascontiguousarray(a, dtype=None): TypeError: float() argument must be a string or a number, not 'dict_values' 

Таким образом, минимальный пример:

 np.array(d.keys(),dtype=float) 

Без спецификации dtype

 In [16]: np.array(d.keys()) Out[16]: array(dict_keys([1, 3]), dtype=object) 

dict_keys рассматривается как object . Обычно вам приходится работать с тем, чтобы np.array обрабатывал объект как список чисел.

 In [17]: np.fromiter(d.keys(),dtype=float) Out[17]: array([ 1., 3.]) 

np.fromiter может обрабатывать d.keys() , рассматривая его как итеративный. Итак, есть некоторые детали в том, как fromiter обрабатывает итерируемый, который отличается от np.array .

Выражение генератора работает одинаково, например (i for i in range(4)) . fromiter может проходить через него, array либо рассматривает его как объект, либо вызывает ошибку.

Если все ошибки, упомянутые в SO, сводятся к np.array(...) обработке генератора, тогда можно будет исправить поведение с одним изменением numpy . Разработчики, конечно же, не хотели бы настраивать каждую функцию и метод, которые могли бы принять список. Но это похоже на фундаментальное изменение, которое должно быть тщательно проверено. И даже тогда это, вероятно, приведет к проблемам обратной совместимости.

2to3 решение, в течение некоторого времени, должно было передать ваш код через 2to3 .

https://docs.python.org/2/library/2to3.html

для словарей:

Исправляет методы итерации словаря. dict.iteritems () преобразуется в dict.items (), dict.iterkeys () в dict.keys () и dict.itervalues ​​() в dict.values ​​(). Аналогично, dict.viewitems (), dict.viewkeys () и dict.viewvalues ​​() преобразуются соответственно в dict.items (), dict.keys () и dict.values ​​(). Он также обертывает существующие обычаи dict.items (), dict.keys () и dict.values ​​() в вызове списка.

  • input () vs sys.stdin.read ()
  • Есть ли какой-нибудь модуль Python 3 для создания PDF-файлов?
  • 2D массив Numpy для таблицы HTML?
  • Почему существует другое поведение от getpwuid и getgrgid?
  • Использовать «байт-подобный объект» из urlopen.read с JSON?
  • Python горит звездочкой в ​​аргументе функции
  • Python - Selenium - Как использовать ярлыки браузера
  • python Как получить iobytes выделенную длину памяти?
  • Python - лучший язык программирования в мире.