容器(container)

容器是一种把多个元素组织在一起的数据结构,容器中的元素可以逐个地迭代获取,可以用in, not in关键字判断元素是否包含在容器中。通常这类数据结构把所有的元素存储在内存中(也有一些特例,并不是所有的元素都放在内存,比如迭代器和生成器对象)在Python中,常见的容器对象有:

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

代码示例:

#创建一个队列

>>> import collections

>>> d=collections.deque()

>>> d.append(2)

>>> d

deque([2])

>>> type(d)

>>> 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 (most recent call last):

File "", line 1, in

a=d.copy()

AttributeError: 'collections.deque' object has no attribute 'copy'

>>> a=b

Traceback (most recent call last):

File "", line 1, in

a=b

NameError: name 'b' is not defined

>>> 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 (most recent call last):

File "", line 1, in

a.count()

TypeError: count() takes exactly one argument (0 given)

>>> count

Traceback (most recent call last):

File "", line 1, in

count

NameError: name 'count' is not defined

>>> d.count(1)

0

>>> d.count(11)

1

>>> a.extend(1)

Traceback (most recent call last):

File "", line 1, in

a.extend(1)

TypeError: 'int' object is not iterable

>>> d.extend([1,2])

>>> d.extend(1)

Traceback (most recent call last):

File "", line 1, in

d.extend(1)

TypeError: 'int' object is not iterable

>>> d.extend('python')

>>> d

deque([11, 1, 2, 'p', 'y', 't', 'h', 'o', 'n'])

>>> d.index(11)

>>> from collections import deque

>>> a=collections.deque()

Traceback (most recent call last):

File "", line 1, in

a=collections.deque()

NameError: name 'collections' is not defined

>>> 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 (most recent call last):

File "", line 1, in

a.pop(2)

TypeError: pop() takes no arguments (1 given)

>>> a.pop()

7

>>> a.popleft()

1

>>>

namedtuple

>>> from collections import namedtuple

>>> 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'

>>> from collections import namedtuple

>>> def get_name():

name=namedtuple("namm",['first','middle','last'])

return name('john','you know nothing','snow')

>>> name=get_name()

>>> name.first

'john'

>>> name.middle

'you know nothing'

>>> name.last

'snow'

>>>

#我们知道tuple可以表示不变集合,例如,一个点的二维坐标就可以表示成:

>>> p = (1, 2)

1

但是,看到(1, 2),很难看出这个tuple是用来表示一个坐标的。

定义一个class又小题大做了,这时,namedtuple就派上了用场

#namedtuple实际用法

>>> from collections import namedtuple

>>> p=namedtuple('point'.['x','y'])

>>> p=namedtuple('point',['x','y'])

>>> p1=point(1,2)

Traceback (most recent call last):

File "", line 1, in

p1=point(1,2)

NameError: name 'point' is not defined

>>> p1=p(1,2)

>>> p.x

>>> p.y

>>> int('p.x',16)

set(可变集合)与frozenset(不可变集合)的区别:

set的特点:

set无序排序且不重复,是可变的,有add(),remove()等方法。

既然是可变的,所以它不存在哈希值。

基本功能包括关系测试和消除重复元素.

集合对象还支持union(联合), intersection(交集), difference(差集)和sysmmetric difference(对称差集)等数学运算.

sets 支持 x in set, len(set),和 for x in set。

作为一个无序的集合,sets不记录元素位置或者插入点。因此,sets不支持 indexing, 或其它类序列的操作。

frozenset的特点:

frozenset是冻结的集合,它是不可变的,存在哈希值,好处是它可以作为字典的key,也可以作为其它集合的元素。

缺点是一旦创建便不能更改,没有add,remove方法

set的用法代码示例:

#创建一个集合

>>> a=set('python')

>>> a

{'o', 'y', 'h', 'n', 'p', 't'}

>>> type(a)

>>> 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('helol python')

>>> 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'}

>>> del s3('p')

SyntaxError: can't delete function call

>>> del s3

>>> s3

Traceback (most recent call last):

File "", line 1, in

s3

NameError: name 's3' is not defined

#成员关系 (in, not in)

1 >>> 'k' in s

2 False

3 >>> 'k' in t

4 True

5 >>> 'c' not in t

6 True

#集合等价和不等价(“==”,“!=”)

>>> a=set('mini')

>>> b=set('d')

>>> a==b

False

>>> set('posh')=set('shop')

SyntaxError: can't assign to function call

>>> set('shop')==set('soph')

True

>>> set(python)

Traceback (most recent call last):

File "", line 1, in

set(python)

NameError: name 'python' is not defined

>>> set(1)

Traceback (most recent call last):

File "", line 1, in

set(1)

TypeError: 'int' object is not iterable

>>> set('1')

{'1'}

>>>

#子集和超子集

>>> set('python')

True

>>> set('python')>=set('p')

True

>>>

#所有集合类型集合的一些方法

1.len(s) 集合基数: 集合 s 中元素的个数

2.set([obj]) 可变集合工厂函数(使用工厂函数的方法创建一个集合); obj 必须是支持迭代的,由 obj 中的元素创建集合,否则创建一个空集合。第二种方法创建直接创建s=(obj)

3.frozenset([obj]) 不可变集合工厂函数; 执行方式和 set()方法相同,但它返回的是不可变集合

4.obj in s 成员测试:obj 是 s 中的一个元素吗?

5.obj not in s 非成员测试: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

3 set(['c', 'b', 'e', 'h', 'k', 'o', 'p', 's'])

2.交集( & )

1 你可以把交集操作比做集合的 AND(或合取)操作。两个集合的交集是一个新集合,该集合中的每

2 个元素同时是两个集合中的成员,即,属于两个集合的成员。交集符号有一个等价的方法,intersection()

3 >>> s & t

4 set(['h', 's', 'o', 'p']

3.差补/相对补集( – )

1 两个集合(s 和 t)的差补或相对补集是指一个集合 C,该集合中的元素,只属于集合 s,而不属

2 于集合 t。差符号有一个等价的方法,difference().

3 >>> s - t

4 set(['c', 'e'])

4.对称差分( ^ )

1 和其他的布尔集合操作相似, 对称差分是集合的 XOR(又称"异或 ").

2 两个集合(s 和 t)的对称差分是指另外一个集合 C,该集合中的元素,只能是属于集合 s 或者集合 t

3 的成员,不能同时属于两个集合。对称差分有一个等价的方法,symmetric_difference().

4 >>> s ^ t

5 set(['k', 'b', 'e', 'c'])

5.混合集合类型操作

1 上面的示例中,左边的 s 是可变集合,而右边的 t 是一个不可变集合. 注意上面使用集合操作

2 运算符所产生的仍然是可变集合,但是如果左右操作数的顺序反过来,结果就不一样了:

3 >>> t | s

4 frozenset(['c', 'b', 'e', 'h', 'k', 'o', 'p', 's'])

5 >>> t ^ s

6 frozenset(['c', 'b', 'e', 'k'])

7 >>> t - s frozenset(['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.代码示例

>>> from collections import defaultdict

>>> a=[('小王',24),('小张',23),('小刘',34),('小李',31),('小董',30),('小丁',27),('小明',28)]

>>> b=defaultdict(list)

>>> for k,v in a:

d[k].append(v)

Traceback (most recent call last):

File "", line 2, in

d[k].append(v)

NameError: name 'd' is not defined

>>> for k,v in a:

b[k].append(v)

>>> b

defaultdict(, {'小丁': [27], '小李': [31], '小刘': [34], '小董': [30], '小张': [23], '小王': [24], '小明': [28]})

>>> for k,v in b.items():

print '%s:%s'%(k,v)

SyntaxError: invalid syntax

>>> for k,v in b.items():

print ('%s:%s'% (k,v))

小丁:[27]

小李:[31]

小刘:[34]

小董:[30]

小张:[23]

小王:[24]

小明:[28]

>>>

对Python比较熟悉的同学可以发现defaultdict(list)的用法和dict.setdefault(key, [])比较类似,上述代码使用setdefault实现如下:

>>> from collections import defaultdict

>>> a=[('小王',24),('小张',23),('小刘',34),('小李',31),('小董',30),('小丁',27),('小明',28)]

>>> d={}

>>> for k,v in a:

d.setdefault(k,[]).append(v)

>>> d

{'小丁': [27], '小李': [31], '小刘': [34], '小董': [30], '小张': [23], '小王': [24], '小明': [28]}

>>> for k,v in d.items():

print('%s:%s'%(k,v))

小丁:[27]

小李:[31]

小刘:[34]

小董:[30]

小张:[23]

小王:[24]

小明:[28]

>>>

#父类继承的方法

>>> class person:

def __init__(self,name,age,gender):

self.name=name

self.age=age

self.gender=gender

>>> class student(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

Counter是一个简单的计数器,例如,统计字符出现的个数

>>> import collections

>>> c=Counter()

>>> for ch in 'python':

c[ch]=c[ch]+1

>>> c

Counter({'y': 1, 'p': 1, 'n': 1, 'h': 1, 'o': 1, 't': 1})

>>> for ch in 'hello python':

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

有序的字典。

>>> import collections

>>> 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基础知识整理——容器相关推荐

  1. python基础知识资料-python基础知识整理(值得收藏)

    近些年python语言非常流行,许多开发者都会学习一些python相关知识,本文为大家整理了python的一些基础知识,希望对大家有一定的帮助. 注:下文Python代指Python3. 基本信息和J ...

  2. python基础知识整理-python爬虫基础知识点整理

    首先爬虫是什么? 网络爬虫(又被称为网页蜘蛛,网络机器人,在FOAF社区中间,更经常的称为网页追逐者),是一种按照一定的规则,自动的抓取万维网信息的程序或者脚本. 根据我的经验,要学习Python爬虫 ...

  3. python基础知识整理-Python3基础知识(一)

    1.使用类似三目运算符的方式来实现一个数的绝对值 if else # 输入一个数,然后利用一个语句求它的绝对值 num = int(input("请输入一个整数:")) num_a ...

  4. python公共基础知识整理_python基础知识整理——字符串

    1.字符串的基本操作 所有标准的序列操作(索引.分片.乘法.判断成员的资格.求长度.取最大值和最小值)都适用于字符串. Python 字符串 字符串是 Python 中最常用的数据类型.我们可以使用引 ...

  5. Python学习--最完整的基础知识大全

    ##Python学习–最完整的基础知识大全 关于python的基础知识学习,网上有很多资料,今天我就把我收藏的整理一下分享给大家! #####菜鸟教程python2 #####菜鸟教程python3 ...

  6. 零基础如何学好Python?Python有哪些必须学的知识?

    跟几个IT界的大佬提起Python,他们说零基础学好Python很简单,Python进阶需要花费些气力.那么零基础如何学好Python?Python有哪些必须学的知识?学习的策略技巧有哪些?今天小千整 ...

  7. python基础知识下载_python基础知识(实用)

    文档来源为 : 从网络收集整理 .word 版本可编辑 . 欢迎下载支持 . 1 Python 基础知识 目录 Python 基础知识 ................................ ...

  8. Python系列 之 matplotlib库 基础知识

    Python系列 之 matplotlib库 基础知识学习 Pyplot 简单示例 中文显示问题 注册全局字体 font_manager.FontProperties注册字体 Figure Figur ...

  9. iOS开发面试知识整理 – OC基础 (二)

    iOS | 面试知识整理 – OC基础 (二) 1.C和 OC 如何混编 xcode可以识别一下几种扩展名文件: .m文件,可以编写 OC语言 和 C 语言代码 .cpp: 只能识别C++ 或者C语言 ...

最新文章

  1. 怎样才能快速批量绑定MAC与IP地址(图)
  2. spring-mybatis.xml 访问html5,Spring mvc无xml配置及利用JdbcTemplate访问数据库
  3. html中前台布局特点,HTML5弹性布局有什么优点
  4. PHP | 检查字符串中是否存在特定的单词/子字符串
  5. 信息学奥赛一本通(1321:【例6.3】删数问题(Noip1994))
  6. 哪里是我们最好的避风港?
  7. 我们在程序员节组织了一场游戏,竟还用Python去验证其公平性?
  8. Cognos访问权限之让拒绝更友善
  9. Ubuntu 16.04编译Android 7.1.2
  10. 《使命召唤7:黑色行动》有什么简单办法进入僵尸模式
  11. 百度开源深度学习框架【飞桨——PaddlePaddle】学习实践一
  12. 企业真实面试题总结(二)
  13. 扩展欧几里得算法(Python)
  14. 从Android运行时出发,打造我们的脱壳神器
  15. go 连接服务器 并存放图片_[本站大事件] 又更换服务器了 – 小文's blog
  16. UT单元测试总结基础篇
  17. css中字体之间的距离是什么意思,css字符间距(css文字间距怎么设置)
  18. 泌阳县鸿蒙机器人编程,鸿蒙教育机器人编程课程开始招生了!!!
  19. 打印正三角形与倒三角形(C++)
  20. linux 无线网络连接不上网,linux无法连接wifi,不显示wifi

热门文章

  1. src或者href值为base64编码代码
  2. java——原型模式
  3. ASP.NET MVC3 读书笔记三(Html辅助方法下)
  4. 【转】完美解决Asp.Net的MasterPage中添加JavaScript路径问题
  5. Visual Studio 2010 模板缺失
  6. 调整viewState的位置
  7. 研究生自学python好找工作么-学完Python好找工作吗?为什么有人学完找不到工作?...
  8. python语言的整数类型是什么-Python|你必须知道的基本数据类型之一:Number类型...
  9. python人脸识别毕业设计-Python 40行代码实现人脸识别功能
  10. python多久学会自学-零基础自学Python多久可以找工作?