Python 数据结构三

set,字典,操作,封装和解构,以及生成器和内建函数

集 Set集

Set set 翻译为集合

collection 翻译为集合类型,是一个大概念

set 是可变的 无序的 不重复的 元素集合
set() 定于一个空集合

set(iterable) 括号里面是可迭代对象

set() 集合里不可以放入可变元素
set()的元素要求必须可以hash

目前学过的不可hasb的类型有list,set

元素不可以索引

set可以迭代

Set 增加

add(elem) 增加一个元素到set

如果元素存在,什么都不做
update(*others)

合并其他元素set集合中来

参数others必须是可迭代对象

就地修改

Set 删除

remove(elem)

从set中移除一个元素,元素不存在,抛出KeyError异常

discard(elem) 从set中移除一个元素,元素不存在,什么都不做

pop() –> item 移除并返回任意的元素,空集返回keyerror异常

clear() 移除所有元素

Set 修改,查询

修改,要么删除,要么加入新的元素

非线性结构无法查询

遍历

可迭代所有元素

成员运算符

in和not in 判断元素是否在set中

Set和线性结构

线性结构的查询时间复杂度是O(n),即随着数据规模的增大而增加耗时 set、dict等结构,内部使用hash值作为Key,时间复杂度可以做到O(1)  查询时间和数据规模无关

可 hash

数值型 int、float、complex

布尔型 True false

字符串 string bytes

tuple

None

以上都是不可变类型,成为可哈希类型,hashable
set的元素必须是可hash的

集合基本概念

全集:所有元素的集合,例如实数,所有实数组成的集合就是全集
子集subset和超集superset:一个集合A的所有元素都在另一个集合B内,A是B的子集,B是A的集
真子集和真超集:A是B的子集,且A不等于B,A就是B的真子集,B是A的真超集
并集:多个集合合并的结果

交集:多个集合公共部分

差集:集合中除去和其他集合公共部分

 

封装和解构

封装

将多个值使用逗号分割,组合在一起 本质上,返回一个元组,只是省掉了小括号

t1 = (1,2) #定义为元组 t2 = 1,2   #将1和2封装成元组 type(t1) type(t2)

封装

a = 4

b = 5

temp = a

a = b

b = temp

等价于   a,b = b,a

解构

把线性结构的元素解开,并顺序的献给其他 变量 左边接纳的变量数要喝右边解开的元素个数一致

lis = [2,3]

first,second = lis

print(first,second)

Python3 的解构

使用 *变量名 接收,但不能单独使用 被 *变量名 收集后组成一个列表

lis = list(range(1,101,2))

head,*mid,stil = lis

变量丢弃

如果不关心一个变量,就可以改变量的名字为 “_”

set的元素必须可以hash
小集合运算 大集合 考虑内存

集合运算
并集:将两个集合A和B的所有元素合并到一起,组成的集合称作集合A与集合B的并集

s1 = {1,2,3}

s2 = {2,3,4}

s = s1 | s2 –>{1,2,3,4}

交集:将两个集合A和B的所有的元素合并到一起,组成的集合称作集合A与集合B的并集

s1 = {1,2,3}

s2 = {2,3,4}

s = s1&s2 –> {2,3}
差集:将集合A和B,由所有属于A且不属于B的元素组成的集合

s1 = {1,2,3}

s2 = {2,3,4}

s = s1-s2 –> {1} s = s2-s1 –> {4}
对称差集:集合A和B,由所有不属于A和B的交集元素组成的集合

s1 = {1,2,3}

s2 = {2,3,4}

s = s1^s2 –> {1,4}
issbset(other) <=

判断当前集合是否是另一个集合的子集

set1 < set2

判断set1是否是set2的真子集.

issuoerset(other) >=

判断当前集合是否是other的超集

set1 < set2

判断set1是否是set的真超集

isdisjoint(other)

当前集合和另一个集合没有交集

没有交集,返回True

字典 dictionarise 字典是一个 可变的 无序的 Key不重复的 类方法

dict.formkeys(range(5))

dict.formkeys(rang(5),0)

字典的访问

d[key]

返回key对应的值vlue key不存在抛出KeyError异常

get(key[,default])

返回key对应的value key不存在返回缺省值,如果没有设置缺省值就返回None

setdefault(key[,defasult])

返回key对应的值value key不存在,增添kv对,value为default,并返回default,如果default没有设置,缺省为None

d = {‘a’:’1′,’b’:’2′} e = {‘x’:’3′,’z’:’4′}

d.setdefault(‘d’,10)

print(d)

d.get(‘d’)

字典增加和修改

d[key] = value  将key对应的值修改为value

key 不存在增加新的kv对

update([other]) –> None

使用另一个字典的kv对更新本字典 key 不存在,就添加 key存在,覆盖已经存在的key对应的值 就地修改

d = {‘a’:’1′,’b’:’2′}

e = {‘x’:’3′,’z’:’4′}

d.update(e)

print(d)

d.update(e)

print(d)

d = {‘a’:’1′,’b’:’2′}

e = {‘x’:’3′,’z’:’4′}

d.update({‘red’:55})

print(d)

字典的删除

pop(key[,default])

key存在,移除它,并返回它的value

key不存在,返回给定的default

popitem()

移除并返回一个任意的键值对

字典为empty,跑出keyError

clear() 清空字典

字典遍历

for .. in dict

遍历 key

for k in d:

print(k)

for k in d.keys():

print(k)

遍历 value

for k in d:

print(k)

for k in d.keys():

print(d.get(k))

字典的key hashable 可哈希才可以作为key

collections.defaultdict([default_factory[,…]])

第一个参数是default_factory,缺省是None,他提供一个初始化函数,当key不存在的时候,会调用这个工厂函数来生成key对应的value
collections.OrderedDict([items])

key 并不是按照加入的顺序排列,可以使用OrdereDict记录顺序 有序字典可以记录匀速插入的顺序,打印的时候也是按照这个顺序输出打印

 

标准库

datetime模块

对日期、时间、时间戳的处理

datetime类

类方法方

today()返回本地时区当前时间的datetime对象

now(tz=None)返回当前时间的datetime对象,时间到微妙,如果tz为None,返回和today()一样

utcnow()没有时区的当前时间

fromtimestamp(timestamp,tz=None)从一个时间戳返回一个datetime对象

datetime对象

timestamp()返回一个到微妙的时间戳

时间戳:格林威治时间1970年1月1日0点到现在的秒数

datetime对象

构造方法 datetime.datetime(2016,12,66,16,29,43,79043)

year、month、day、hour、minute、second、microsecond,取datetime对象的年月日时分秒及微妙 weekday() 返回星期的天,周一0,周日6

isoweekday() 返回星期的天,周一1,周日7

date() 返回日期date对象

time() 返回时间time对象

replace() 修改并返回新的时间

isocalendar() 返回一个三元组(年,周数,周的天)

列表解析

生成一个列表0-9,对每一个元素自增1后求平方根返回新的列表
l = [(i+1)**2 for i in (range(10))]

print(l)

print(type(l))
语法

[返回值 for 元素 in 可迭代对象 if]

使用中括号[], 内部是for循环, if条件语句可选 返回一个新的列表

列表解析进阶

[expr for item in iterable if cond1 if cond2]

[i for i in range(10) if x%2==0 and if x%3==0]

[exper for i in iterable1 for j in iterable2] [(x,y) for x in ‘abcde’ for y in range(3)]

生成器

语法(返回值 for 元素 in 可迭代对象 if 条件)

列表解析式的中括号换成小括号就行了

返回一个生成器 延迟计算

返回迭代器,可以迭代

从前到后走完一遍,不能回头

和列表解析式的区别

生成器表达式是按需计算(或称惰性求职、延迟计算),需要的时候才计算

列表解析式是立即返回值
生成器表达式省内存,列表解析式返回新的列表

集合解析式

{返回值 for 元素 in 可迭代对象 if条件}

列表解析式的中括号换成大括号{}就可以 立即返回一个集合

字典解析式

{返回值 for 元素 in 可迭代对象 if 条件}

列表解析式的中括号换成大括号{}就可以

使用key:value形式 立即返回一个字典

{chr(0x41+x):x**2 for x in range(10)}

内建函数

标识 id 返回对象的唯一标识,CPython返回内存地址

哈希 hash()  返回一个对象的哈希值 类型 type()  返回对象的类型

类型转换

flot()、int()、bin()、hex()、oct()、list()、tuple()、dict()、set() 、comple()、bytes、bytearry()

输入 input() 接受用户输入,返回一个字符串

对象长度 len(s) 返回一个集合类型的元素个数

isinstance(obj,class_or_tuple) 判断对象obj是否属于某种类型或者元组中列出的某个类型 isinstance(True,int)

issubclass(cls,class_or_tuple)

判断类型cls是否是某种类型的子类或元组中列出的某个类型的子类 issubclass(bool,int)

绝对值 abx(x)   x为数值

最大值 max(x)   最小值min()

round(x) 四舍六入五去偶,round(-0.5) pow(x,y)

等价于 x**y sum(iterable[,start]) 对可迭代对象的所有数值元素求和

sum(range(1,100,2))

chr(i) 给一个一定范围的整数返回对应的字符

chr(97) chr(20013) ord(‘a’) ord(‘中’)  返回字符对应的整数
sorted(iterable[,key][,reverse])  排序

翻转 reversed(seq)

 

枚举

enumerate(seq,start=0)  迭代一个序列,返回索引数字和元素构成的二元组

本文来自投稿,不代表Linux运维部落立场,如若转载,请注明出处:http://www.178linux.com/87746

(0)
上一篇 2017-10-10 15:02
下一篇 2017-10-10 16:56

相关推荐

  • python正则表达式

    正则表达式^行首锚定 $行尾锚定.匹配任意字符一次\w匹配非空白字符一次\s匹配空白字符一次\d匹配数字一次*表示前面的正则表达式会重复0到多次+匹配前面的字符重复0到多次.+ 相当于匹配多次任意字符,至少一次\w+相当于匹配非空字符一到多次?前面的字符匹配一次或不匹配 有一个上面两种类似的{}表示前面的字符出现次数{1,}相当于+ {0,1}相当于? {n…

    2017-11-07
  • 文件操作

    文件操作 冯诺依曼体系架构 CPU由运算器和控制器组成 运算器,完成各种算数的运算,逻辑运算,数据传输等数据加工处理 控制器,控制程序的执行 存储器,用于记忆程序的数据,列如内存 输入设备,将数据或者程序输入到计算机中列如键盘 鼠标 输出设备,将数据或者程序的处理结果展示给用户,列如显示器,打印机等等   一般说的IO操作,指的是文件的IO,如果是指网络的I…

    Python笔记 2018-05-02
  • Python 部分知识点总结(六)

    此篇博客只是记录第八周未掌握或不熟悉的知识点,用来加深印象。

    Python笔记 2018-05-02
  • Python 部分知识点总结(五)

    此篇博客只是记录第七周未掌握或不熟悉的知识点,用来加深印象。

    Python笔记 2018-04-25
  • StringIO

    StringIOio模块中的类From io import StringIO内存中,开辟的一个文本模式的buffer,可以像文件对象一样操作它当close方法被调用的时候,这个buffer会被释放StringIO操作getvalue() 获取全部内容。跟文件指针没有关系from io import StringIO# 内存中构建sio = StringIO(…

    Python笔记 2018-05-07
  • 程序员如何在小公司成长和大公司学习-python

    这篇文章会带有普遍性,不见得适合所有人,或者文章所描述的也不见得是对的,只是根据我的经历和所见写成的一篇文章,仅供参考。 前言: 在软件行业工作有几个年头了,换过多个开发语言,跳过槽,也被猎头找过,经历了三五杆枪打天下和创业公司一起成长灭亡,也进入了大公司。在这些年的历练中,看见很多刚进入软件行业不久的新人总在抱怨,说学不到东西。其实不管你在大公司还是小公司…

    Python干货 2015-03-16