python2.x中函数在python3.x中的改动方法

时间:2022-10-01 13:54:06

一、pickle函数

python2.x中:fw=open(filename,'w')和fr=open(filename,'r'),

python3.x中:fw=open(filename,'wb')和fr=open(filename,'rb')。

二、dict.keys()

在python2.x中,dict.keys()返回一个列表,在python3.x中,dict.keys()返回一个dict_keys对象,比起列表,这个对象的行为更像是set,所以不支持索引的。

解决方案:list(dict.keys())[index]

三、字典中的.iteritems()函数

python2.x中为.iteritems(),

python3.x中为.items()。

四、range对象在python3.x中不能删除

python2.x中,st=range(0,50);del(st[4])能够运行

python3.x中,st=list(range(0,50));del(st[4])才能够运行

五、map函数在python3.x中不能直接使用了

python2.x中的map(float,[1,2,3])即把后面的list转换成float并返回list

python3.x中必须用list(map(float,[1,2,3]))来转换,否则转换结果是<map object at 0x028DBDD0>

六、numpy数组和矩阵向list转换

Python中库numpy中的array和mat向list转换都有转换函数.tolist(),直接调用即可。

七、set的构建

在python2.x中,可以直接用set(list)或者set(mat)或者set(array)来构建,但是

在python3.x中,不能使用这三种,因为这三种是可动态扩充的即提示“unhashable type: 'matrix'”,这个问题需要用tuple元组来解决,必须先把array或者matrix转换成元素,然后才能用set,组成set(tuple(array/list/mat))的形式。注意必须彻底转换,[[1,2,3][1,2,3]]这样的是不行的,只能进行一行或一列的转换[1,2,3]才行,[[1,2,3]]这样也不行,即必须只能有一个[]!!!

这个是我在看《机器学习实战》的时候遇到的,纠结了好长时间。

因为使用的Python3的缘故,所以使用《机器学习实战》里面的代码总是遇到各种问题,这次是第9章程序清单9-2回归树切分函数里的一行:

[python] view plain copy
  1. for splitVal in set(dataSet[:,featIndex]):  

出现的错误是:

[plain] view plain copy
  1. TypeError: unhashable type: 'matrix'  
即matrix类型不能被hash。

经过我各种试验,最终解决了这个问题,把代码改为如下即可:

[python] view plain copy
  1. for splitVal in set((dataSet[:,featIndex].T.A.tolist())[0]):  

八、sorted函数

在python2.x中,sorted函数有一个可选参数是cmp,可以指定比较函数,但是

在python3.x中,sorted函数去掉了这个cmp参数,那么如何补救呢?可以用key=functools.cmp_to_key(func)来代替。具体的排序可以参考:

http://www.cnblogs.com/65702708/archive/2010/09/14/1826362.html

九、在字典中遍历keys,并且同时删除

在python2.x中,如果a={},那么遍历可以用for item in a.keys() if.... delet(a[item])。如果用for item in a if.... delet(a[item])是会出错的

在python3.x中,第一中情况也会出错,需要L=list(a.keys()),然后for item in L if.... delet(a[item])