Объекты просмотра словаря 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 ​​() в вызове списка.

  • Итератор Python пуст после выполнения некоторых действий на нем
  • как получить текст из тега, но игнорировать другие дочерние теги
  • Почему urlopen может загружать страницу поиска Google, но не страницу поиска Google Scholar?
  • 7 бит до 0xEF
  • Ubuntu: пип не работает с python3.4
  • numpy & pandas 'ModuleNotFoundEror' в ноутбуке Jupyter (Python 3)
  • Построение сплошной революции в Python 3 (возможно, matplotlib)
  • Почему Python Ref подсчитывает небольшие числа на удивление высоко?
  • Файл поиска can not Python
  • Сохранение памяти Py3k, возвращая итераторы, а не списки
  • Неверный ответ в SPOJ `CUBERT`
  • Python - лучший язык программирования в мире.