Python 3.x的字典查看对象和matplotlib

python 3.x键()中,values()和items()返回views.现在视图肯定有advantages,它们似乎也会引起一些兼容性问题.例如与matplotlib(最终它是与numpy).作为示例,thisthis stackexchange问​​题的答案与python 2.x正常工作,但在python 3.4中执行时会引发异常.

一个最小的例子是:

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

其中引发TypeError:float()参数必须是字符串或数字,而不是“dict_values”与python 3.4.

虽然对于最小的例子,异常很清楚,因为同样的问题出现了this的问题,而这里的异常还不太清楚:TypeError:ufunc’isfinite’不支持输入类型,输入不能被安全地强制根据铸造规则“安全”的任何支持的类型

处理这个问题的最佳做法是什么?我们希望在一个新版本的matplotlib(或最终numpy)这个问题将被处理,或者我们应该开始写像list(dict.values())当使用matplotlib只是为了确保不会遇到麻烦用python 3.x?

更多的错误:

--> 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被视为一个对象.通常你必须保持np.array的方式处理一个对象作为数字列表.

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

np.fromiter可以处理d.keys(),将其视为可迭代的.所以有一些细节如何fromiter处理一个不同于np.array的迭代.

生成器表达式的工作方式相同,例如(我为我在范围(4)). fromiter可以遍历它,数组可以将其视为对象或引发错误.

如果SO提到的所有错误都被归结为np.array(…)处理一个生成器,那么可能会修改一个numpy更改的行为.开发者肯定不想调整可能接受列表的每个函数和方法.但它的感觉就像一个根本的变化,必须经过彻底的测试.即使如此,它也可能产生向后兼容性问题.

接受的修复,一段时间以来,一直是通过你的代码通过2to3.

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

字典:

Fixes dictionary iteration methods. dict.iteritems() is converted to dict.items(), dict.iterkeys() to dict.keys(), and dict.itervalues() to dict.values(). Similarly, dict.viewitems(), dict.viewkeys() and dict.viewvalues() are converted respectively to dict.items(), dict.keys() and dict.values(). It also wraps existing usages of dict.items(), dict.keys(), and dict.values() in a call to list.

翻译自:https://stackoverflow.com/questions/31755900/python-3-xs-dictionary-view-objects-and-matplotlib

转载注明原文:Python 3.x的字典查看对象和matplotlib