python基础知识整理——容器
2018-02-21 00:00
676 查看
容器(container)
容器是一种把多个元素组织在一起的数据结构,容器中的元素可以逐个地迭代获取,可以用list,deque(队列),….
set,(可变集合)frozensets(不可变集合),….
dict,defaultdict(默认字典),OrderedDict(有序字典),Counter(计数器),….
tuple,namedtuple(namedtuple是继承自tuple的子类。namedtuple创建一个和tuple类似的对象,而且对象拥有可访问的属性。),…
str
deque(双向队列)
创建一个双向队列
队列方法
向右添加——append
向左添加——appendleft
清空队列
浅copy
计数——count
在队列的左边添加一个元素——extendleft
在队列的右边添加一个元素——extend
插入某个元素——insert
在左边和右边删除某个元素——pop/popleft
移除某个指定的元素——remove
反转队列元素——reverse
把队列右边元素放到左边——rotate
代码示例:
#创建一个队列 >>>importcollections >>>d=collections.deque() >>>d.append(2) >>>d deque([2]) >>>type(d) <class'collections.deque'> >>>d.append('python') >>>d deque([2,'python']) >>>d.append('a') >>>d deque([2,'python','a']) >>>d.appendleft('hello') >>>d deque(['hello',2,'python','a']) >>>d.appendleft('python') >>>d deque(['python','hello',2,'python','a']) >>>a=d.copy() Traceback(mostrecentcalllast): File"<pyshell#15>",line1,in<module> a=d.copy() AttributeError:'collections.deque'objecthasnoattribute'copy' >>>a=b Traceback(mostrecentcalllast): File"<pyshell#16>",line1,in<module> a=b NameError:name'b'isnotdefined >>>a=d >>>a deque(['python','hello',2,'python','a']) >>>d deque(['python','hello',2,'python','a']) >>>a.clear() >>>a deque([]) >>>a.append(11) >>>a deque([11]) >>>d deque([11]) >>>d deque([11]) >>>a deque([11]) >>>d deque([11]) >>>a.count() Traceback(mostrecentcalllast): File"<pyshell#28>",line1,in<module> a.count() TypeError:count()takesexactlyoneargument(0given) >>>count Traceback(mostrecentcalllast): File"<pyshell#29>",line1,in<module> count NameError:name'count'isnotdefined >>>d.count(1) 0 >>>d.count(11) 1 >>>a.extend(1) Traceback(mostrecentcalllast): File"<pyshell#32>",line1,in<module> a.extend(1) TypeError:'int'objectisnotiterable >>>d.extend([1,2]) >>>d.extend(1) Traceback(mostrecentcalllast): File"<pyshell#34>",line1,in<module> d.extend(1) TypeError:'int'objectisnotiterable >>>d.extend('python') >>>d deque([11,1,2,'p','y','t','h','o','n']) >>>d.index(11) >>>fromcollectionsimportdeque >>>a=collections.deque() Traceback(mostrecentcalllast): File"<pyshell#52>",line1,in<module> a=collections.deque() NameError:name'collections'isnotdefined >>>a=deque() >>>a=deque([1,2,3,4,5,6,6,7]) >>>a deque([1,2,3,4,5,6,6,7]) >>>a.pop(2) Traceback(mostrecentcalllast): File"<pyshell#56>",line1,in<module> a.pop(2) TypeError:pop()takesnoarguments(1given) >>>a.pop() 7 >>>a.popleft() 1 >>>
namedtuple
>>>fromcollectionsimportnamedtuple >>>f=nametuple("friend",['name','age','email']) >>>f=namedtuple("friend",['name','age','email']) >>>f1=f('小王',33,'xiaowang@163.com') >>>f1 friend(name='小王',age=33,email='xiaowang@163.com') >>>f1.age 33 >>>f1.email 'xiaowang@163.com' >>>f2=f(name='小张',email='xiaozhang',age=30) >>>f2 friend(name='小张',age=30,email='xiaozhang') >>>f2.age 30 >>>f2.email 'xiaozhang' >>>name,age,email=f2 >>>name '小张' >>>age 30 >>>email 'xiaozhang' >>>fromcollectionsimportnamedtuple >>>defget_name(): name=namedtuple("namm",['first','middle','last']) returnname('john','youknownothing','snow') >>>name=get_name() >>>name.first 'john' >>>name.middle 'youknownothing' >>>name.last 'snow' >>> #我们知道tuple可以表示不变集合,例如,一个点的二维坐标就可以表示成: >>>p=(1,2) 1 但是,看到(1,2),很难看出这个tuple是用来表示一个坐标的。 定义一个class又小题大做了,这时,namedtuple就派上了用场 #namedtuple实际用法 >>>fromcollectionsimportnamedtuple >>>p=namedtuple('point'.['x','y']) >>>p=namedtuple('point',['x','y']) >>>p1=point(1,2) Traceback(mostrecentcalllast): File"<pyshell#63>",line1,in<module> p1=point(1,2) NameError:name'point'isnotdefined >>>p1=p(1,2) >>>p.x <propertyobjectat0x0000000002AEA318> >>>p.y <propertyobjectat0x0000000006150A48> >>>int('p.x',16)
set(可变集合)与frozenset(不可变集合)的区别:
set的特点:
set无序排序且不重复,是可变的,有add(),remove()等方法。
既然是可变的,所以它不存在哈希值。
基本功能包括关系测试和消除重复元素.
集合对象还支持union(联合),intersection(交集),difference(差集)和sysmmetricdifference(对称差集)等数学运算.
sets支持xinset,len(set),和forxinset。
作为一个无序的集合,sets不记录元素位置或者插入点。因此,sets不支持indexing,或其它类序列的操作。
frozenset的特点:
frozenset是冻结的集合,它是不可变的,存在哈希值,好处是它可以作为字典的key,也可以作为其它集合的元素。
缺点是一旦创建便不能更改,没有add,remove方法
set的用法代码示例:
#创建一个集合 >>>a=set('python') >>>a {'o','y','h','n','p','t'} >>>type(a) <class'set'> >>>s=('hello') >>>s 'hello' >>>s=(1) >>>s 1 >>>s=(a) >>>s {'o','y','h','n','p','t'} >>>s {'o','y','h','n','p','t'} >>>s=('a') >>>s 'a' >>>s 'a' >>>s=a >>>s {'o','y','h','n','p','t'} >>>t=frozenset(a) >>>t frozenset({'t','o','y','n','h','p'})
集合的方法
#更新可变集合 >>>s3=set('helolpython') >>>s3 {'o','l','e','y','','h','n','p','t'} >>>s3.add(1) >>>s3 {1,'o','l','e','y','','h','n','p','t'} >>>s3.update('pypi') >>>s3 {1,'o','l','e','y','','h','n','i','p','t'} >>>s3.remove(1) >>>s3 {'o','l','e','y','','h','n','i','p','t'} >>>s-=set('pypi') >>>s3-=set('pypi') >>>s3 {'o','l','e','','h','n','t'} >>>dels3('p') SyntaxError:can'tdeletefunctioncall >>>dels3 >>>s3 Traceback(mostrecentcalllast): File"<pyshell#116>",line1,in<module> s3 NameError:name's3'isnotdefined #成员关系(in,notin) 1>>>'k'ins 2False 3>>>'k'int 4True 5>>>'c'notint 6True #集合等价和不等价(“==”,“!=”) >>>a=set('mini') >>>b=set('d') >>>a==b False >>>set('posh')=set('shop') SyntaxError:can'tassigntofunctioncall >>>set('shop')==set('soph') True >>>set(python) Traceback(mostrecentcalllast): File"<pyshell#122>",line1,in<module> set(python) NameError:name'python'isnotdefined >>>set(1) Traceback(mostrecentcalllast): File"<pyshell#123>",line1,in<module> set(1) TypeError:'int'objectisnotiterable >>>set('1') {'1'} >>> #子集和超子集 >>>set('python')<set('hellopython') True >>>set('python')>=set('p') True >>> #所有集合类型集合的一些方法 1.len(s)集合基数:集合s中元素的个数 2.set([obj])可变集合工厂函数(使用工厂函数的方法创建一个集合);obj必须是支持迭代的,由obj中的元素创建集合,否则创建一个空集合。第二种方法创建直接创建s=(obj) 3.frozenset([obj])不可变集合工厂函数;执行方式和set()方法相同,但它返回的是不可变集合 4.objins成员测试:obj是s中的一个元素吗? 5.objnotins非成员测试:obj不是s中的一个元素吗? s==t等价测试:测试s和t是否具有相同的元素? s!=t不等价测试:与==相反 s<t(严格意义上)子集测试;s!=t而且s中所有的元素都是t的成员 s.issubset(t)s<=t子集测试(允许不严格意义上的子集):s中所有的元素都是t的成员 s>t(严格意义上)超集测试:s!=t而且t中所有的元素都是s的成员 s.issuperset(t)s>=t超集测试(允许不严格意义上的超集):t中所有的元素都是s的成员 s.union(t)s|t合并操作:s或t中的元素 s.intersec-tion(t)s&t交集操作:s和t中的元素 s.difference(t)s-t差分操作:s中的元素,而不是t中的元素 s.symmetric_difference(t)s^t对称差分操作:s或t中的元素,但不是s和t共有的元素 s.copy()复制操作:返回s的(浅复制)副本 #可变集合的方法,frozenset不能使用 s.update(t)s|=t(Union)修改操作:将t中的成员添加s s.intersection_update(t)s&=t交集修改操作:s中仅包括s和t中共有的成员 s.difference_update(t)s-=t差修改操作:s中包括仅属于s但不属于t的成员 s.symmetric_ difference_ update(t)s^=t对称差分修改操作:s中包括仅属于s或仅属于t的成员 s.add(obj)加操作:将obj添加到s s.remove(obj)删除操作:将obj从s中删除;如果s中不存在 obj,将引发KeyError s.discard(obj)丢弃操作:remove()的友好版本-如果s中存在obj,从s中删除它 s.pop()Pop操作:移除并返回s中的任意一个元素 s.clear()清除操作:移除s中的所有元素
集合类型操作符
>>>s=set('cheeseshop') >>>t=frozenset('bookshop') 1.联合(|) 1两个集合的联合是一个新集合,该集合中的每个元素都至少是其中一个集合的成员,即,属于两个集合其中之一的成员。联合符号有一个等价的方法,union(). 2>>>s|t 3set(['c','b','e','h','k','o','p','s']) 2.交集(&) 1你可以把交集操作比做集合的AND(或合取)操作。两个集合的交集是一个新集合,该集合中的每 2个元素同时是两个集合中的成员,即,属于两个集合的成员。交集符号有一个等价的方法,intersection() 3>>>s&t 4set(['h','s','o','p'] 3.差补/相对补集(–) 1两个集合(s和t)的差补或相对补集是指一个集合C,该集合中的元素,只属于集合s,而不属 2于集合t。差符号有一个等价的方法,difference(). 3>>>s-t 4set(['c','e']) 4.对称差分(^) 1和其他的布尔集合操作相似,对称差分是集合的XOR(又称"异或"). 2两个集合(s和t)的对称差分是指另外一个集合C,该集合中的元素,只能是属于集合s或者集合t 3的成员,不能同时属于两个集合。对称差分有一个等价的方法,symmetric_difference(). 4>>>s^t 5set(['k','b','e','c']) 5.混合集合类型操作 1上面的示例中,左边的s是可变集合,而右边的t是一个不可变集合.注意上面使用集合操作 2运算符所产生的仍然是可变集合,但是如果左右操作数的顺序反过来,结果就不一样了: 3>>>t|s 4frozenset(['c','b','e','h','k','o','p','s']) 5>>>t^s 6frozenset(['c','b','e','k']) 7>>>t-sfrozenset(['k','b'])
如果左右两个操作数的类型相同,既都是可变集合或不可变集合,则所产生的结果类型是相同
的,但如果左右两个操作数的类型不相同(左操作数是set,右操作数是frozenset,或相反情况),
则所产生的结果类型与左操作数的类型相同。
defaultdict(默认字典),OrderedDict(有序字典),Counter(计数器)
一、defaultdict
1.简介
在使用Python原生的数据结构dict的时候,如果用d[key]这样的方式访问,当指定的key不存在时,是会抛出KeyError异常的。但是,如果使用defaultdict,只要你传入一个默认的工厂方法,那么请求一个不存在的key时,便会调用这个工厂方法使用其结果来作为这个key的默认值。
defaultdict在使用的时候需要传一个工厂函数(function_factory),defaultdict(function_factory)会构建一个类似dict的对象,该对象具有默认值,默认值通过调用工厂函数生成。
2.代码示例
>>>fromcollectionsimportdefaultdict
>>>a=[('小王',24),('小张',23),('小刘',34),('小李',31),('小董',30),('小丁',27),('小明',28)]
>>>b=defaultdict(list)
>>>fork,vina:
d[k].append(v)
Traceback(mostrecentcalllast):
File"<pyshell#5>",line2,in<module>
d[k].append(v)
NameError:name'd'isnotdefined
>>>fork,vina:
b[k].append(v)
>>>b
defaultdict(<class'list'>,{'小丁':[27],'小李':[31],'小刘':[34],'小董':[30],'小张':[23],'小王':[24],'小明':[28]})
>>>fork,vinb.items():
print'%s:%s'%(k,v)
SyntaxError:invalidsyntax
>>>fork,vinb.items():
print('%s:%s'%(k,v))
小丁:[27]
小李:[31]
小刘:[34]
小董:[30]
小张:[23]
小王:[24]
小明:[28]
>>>
对Python比较熟悉的同学可以发现defaultdict(list)的用法和dict.setdefault(key,[])比较类似,上述代码使用setdefault实现如下:
>>>fromcollectionsimportdefaultdict
>>>a=[('小王',24),('小张',23),('小刘',34),('小李',31),('小董',30),('小丁',27),('小明',28)]
>>>d={}
>>>fork,vina:
d.setdefault(k,[]).append(v)
>>>d
{'小丁':[27],'小李':[31],'小刘':[34],'小董':[30],'小张':[23],'小王':[24],'小明':[28]}
>>>fork,vind.items():
print('%s:%s'%(k,v))
小丁:[27]
小李:[31]
小刘:[34]
小董:[30]
小张:[23]
小王:[24]
小明:[28]
>>>
#父类继承的方法
>>>classperson:
def__init__(self,name,age,gender):
self.name=name
self.age=age
self.gender=gender
>>>classstudent(person):
def__init__(self,name,age,gender,school,score):
#super(student,self).__init__(name,age,gender,school,score)
self.name=name.upper()#大写
self.age=age
self.school=school
self.score=score
>>>s=student(name='cai',age=26,gender=3,school='beijing',score=699)
defaultdict在python2.5以后才添加的。
二.Counter
>>>importcollections
>>>c=Counter()
>>>forchin'python':
c[ch]=c[ch]+1
>>>c
Counter({'y':1,'p':1,'n':1,'h':1,'o':1,'t':1})
>>>forchin'hellopython':
c[ch]=c[ch]+1
>>>c
Counter({'h':3,'o':3,'y':2,'p':2,'n':2,'l':2,'t':2,'':1,'e':1})
>>>
三.OrderedDict
有序的字典。
>>>importcollections
>>>d=collections.OrderedDict
>>>d=OrderedDict()
>>>od=OrderedDict([('name','cai'),('age',26),('gender',5),('sorce',700)])
>>>od
OrderedDict([('name','cai'),('age',26),('gender',5),('sorce',700)])
>>>od['address']='beijing'
>>>od
OrderedDict([('name','cai'),('age',26),('gender',5),('sorce',700),('address','beijing')])
相关文章推荐
- Python基础知识整理——数据对象之间的转换
- python基础知识整理
- Python 基础知识点整理
- python 基础知识点整理 和详细应用
- python基础知识整理
- python 基础知识点整理 和具体应用
- python基础知识整理——字符串
- python基础知识整理——条件/循环语句
- python基础知识整理
- python基础知识整理
- python3基础知识整理之字符串处理
- Python随笔(一) 基础知识整理
- python爬虫基础知识整理
- Python基础知识点整理1
- python基础知识整理——数字
- python基础知识整理——错误以及异常处理
- Python基础知识整理
- python爬虫基础知识整理——urlerror异常处理
- python基础学习整理——基础知识
- python 基础操作知识整理总结