ThirdWeek_SecondDay

Python学习笔记整理

# 集合运算

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

union(*others)
返回和多个集合合并后的新的集合

|: 运算符重载
等同union

In [6]: s1 = {1,2,3,4}

In [7]: s2 = {1,4,5,6}

In [8]: s1 |s2
Out[8]: {1, 2, 3, 4, 5, 6}

In [9]: s1.union(s2)
Out[9]: {1, 2, 3, 4, 5, 6}

update(*others)
和多个集合合并,就地修改

|=:
等同于update
In [10]: s1 |= s2

In [11]: s1
Out[11]: {1, 2, 3, 4, 5, 6}

## 交集

1、集合A和B,由所有属于A且属于B的元素组成的集合

intersction(*others)
返回多个集合的交集

&:
等同于intersection
In [12]: s1 & s2
Out[12]: {1, 4, 5, 6}

In [13]: s1
Out[13]: {1, 2, 3, 4, 5, 6}

In [14]: s2
Out[14]: {1, 4, 5, 6}

intersection_update(*others)
获取和多个集合的交集,并就地修改

&=:
等同于intersection_update
In [18]: s1 &= s2

In [19]: s1
Out[19]: {1, 4, 5, 6}

In [20]: s2
Out[20]: {1, 4, 5, 6}

## 差集

集合A和B,由所有属于A且不属于B的元素组成的集合

difference(*others)
返回多个集合的差集

-:
等同于difference

In [21]: s1 = {1, 2, 3, 4, 5, 6}

In [22]: s2
Out[22]: {1, 4, 5, 6}

In [23]: s1 – s2
Out[23]: {2, 3}

difference_update(*others)
获取和多个集合的差集并就地修改

-=:
等同于difference_update

In [24]: s1
Out[24]: {1, 2, 3, 4, 5, 6}

In [25]: s2
Out[25]: {1, 4, 5, 6}

 

In [27]: s1 -= s2

In [28]: s1
Out[28]: {2, 3}

In [29]: s2
Out[29]: {1, 4, 5, 6}

## 对称差集
集合A和B,由所有不属于A和B的交集元素组成的集合,记作(A-B)u(B-A)

symmetric_differece(other)
返回和另一个集合的差集

^:
等同于symmetric_differece

In [1]: s1 = {1,2,3,4,5,6}

In [2]: s2 = {5,6,7,8,9}

In [3]: s1 ^ s2
Out[3]: {1, 2, 3, 4, 7, 8, 9}

symmetric_differece_update(other)
获取和另一个集合的差集并就地修改

^=:
等同于symmetric_differece_update

In [3]: s1
Out[3]: {1, 2, 3, 4, 5, 6}

In [4]: s2
Out[4]: {4, 5, 6, 7, 8, 9}

In [5]: s1 ^= s2

In [6]: s1
Out[6]: {1, 2, 3, 7, 8, 9}

issubset(other),<=
判断当前集合是否是另一个集合的子集

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

issuperset(other)、>=
判断当前集合是否是other的超集

isdisjoint(other)
当前集合和另一个集合没有交集
没有交集返回Tru

# dict字典

### 字典

1、key-value键值对的数据的集合
2、可变的、无序的、key不重复
Question:键值对的含义和概念?

### 字典dict定义 初始化
1、d = dict()或者 d = {},后者为常用
2、dict(**kwargs)使用可迭代对象和name=value对构造字典,不过可以迭代对象的元素必须为一个二元结构
model:
d = dict(((1,’a’),(2,’b’)))
In [260]: d
Out[260]: {1: ‘a’, 2: ‘b’}

或者d = dict(([1,’a’],[2,’b’]))
In [261]: d = dict(([1,’a’],[2,’b’]))

In [262]: d
Out[262]: {1: ‘a’, 2: ‘b’}
3、dict(mapping,**kwarg)使用一个字典构建另一个字典
4、d = {‘a’:10,’b’:20,’c’:None,’d’:[1,2,3]}
5、类方法dict.fromkeys(iterable,value)
d = dict.fromkeys(range(5))
d = dict.fromkeys(range(5),0)

model:
In [263]: d = dict.fromkeys(range(5))

In [264]: d
Out[264]: {0: None, 1: None, 2: None, 3: None, 4: None}

In [265]: d = dict.fromkeys(range(5),0)

In [266]: d
Out[266]: {0: 0, 1: 0, 2: 0, 3: 0, 4: 0}
备注:4的方法比较常用,需多加熟悉和练习

一些其它的例子:
In [267]: d = dict(a=5,b=6,z=[1,2,3])

In [268]: d
Out[268]: {‘a’: 5, ‘b’: 6, ‘z’: [1, 2, 3]}

In [269]: d = dict(a=5,b=6,z=[123])

In [270]: d
Out[270]: {‘a’: 5, ‘b’: 6, ‘z’: [123]}

In [271]: l1 = list(range(5))

In [272]: l1
Out[272]: [0, 1, 2, 3, 4]

In [273]: d = dict(enumerate(l1))

In [274]: d
Out[274]: {0: 0, 1: 1, 2: 2, 3: 3, 4: 4} #返回的都是二元组

In [275]: e = enumerate(l1)

In [276]: e
Out[276]: <enumerate at 0x7f20aefa0048>

In [277]: type(e)
Out[277]: enumerate

In [278]: d = dict(e)

In [279]: d
Out[279]: {0: 0, 1: 1, 2: 2, 3: 3, 4: 4}

In [1]: d1 = dict.fromkeys(range(1,11))

In [2]: d2 = dict.fromkeys(range(1,11),[1,2])

In [3]: d3 = dict.fromkeys(range(1,11),1)

In [4]: d4 = dict.fromkeys(range(1,11),[1])

In [5]: d1
Out[5]:
{1: None,
2: None,
3: None,
4: None,
5: None,
6: None,
7: None,
8: None,
9: None,
10: None}

In [6]: d2
Out[6]:
{1: [1, 2],
2: [1, 2],
3: [1, 2],
4: [1, 2],
5: [1, 2],
6: [1, 2],
7: [1, 2],
8: [1, 2],
9: [1, 2],
10: [1, 2]}

In [7]: d3
Out[7]: {1: 1, 2: 1, 3: 1, 4: 1, 5: 1, 6: 1, 7: 1, 8: 1, 9: 1, 10: 1}

In [8]: d4
Out[8]:
{1: [1],
2: [1],
3: [1],
4: [1],
5: [1],
6: [1],
7: [1],
8: [1],
9: [1],
10: [1]}

备注:千万不要使用d2[10].append(3)
展示如下:
In [13]: d2[10].append(3)

In [14]: d2
Out[14]:
{1: [1, 2, 3],
2: [1, 2, 3],
3: [1, 2, 3],
4: [1, 2, 3],
5: [1, 2, 3],
6: [1, 2, 3],
7: [1, 2, 3],
8: [1, 2, 3],
9: [1, 2, 3],
10: [1, 2, 3]}

### 字典元素的访问
1、d[key]
返回key对应的值value
key不存在抛出KeyError异常
In [18]: d3[1]
Out[18]: 1

2、get(key[,default])
返回key对应的值value
key不存在返回缺省值,如果没有设置缺省值就返回None

In [20]: d3.get(9)
Out[20]: 1

In [23]: s = d3.get(11)

In [24]: s

In [25]: type(s)
Out[25]: NoneType

由返回值就可以使用判断,if None或者if not None

3、setdefault(key[,default])
返回key对应的值value
key不存在,添加kv对,value为default,并返回default,如果default没有设置,缺省值为None

In [30]: d = dict(([(1,3,4),{1,3,5,6}],))

In [31]: d[(1,3,4)]
Out[31]: {1, 3, 5, 6}

In [32]: d.setdefault(‘a’,3)
Out[32]: 3

In [33]: d
Out[33]: {‘a’: 3, (1, 3, 4): {1, 3, 5, 6}}

In [37]: d[‘a’]
Out[37]: 3

In [38]: d
Out[38]: {‘a’: 3, (1, 3, 4): {1, 3, 5, 6}}

In [39]: d[‘a’] = 100

In [40]: d
Out[40]: {‘a’: 100, (1, 3, 4): {1, 3, 5, 6}}

### 字典增加和修改
d[key] = value
将key对应的值修改为value
key不存在添加新的kv对

In [44]: d
Out[44]: {‘a’: 100, (1, 3, 4): {1, 3, 5, 6}}

In [45]: d[‘a’]
Out[45]: 100

In [46]: d[‘b’] = 10

In [47]: d
Out[47]: {‘a’: 100, ‘b’: 10, (1, 3, 4): {1, 3, 5, 6}}

update([other]) -> None
使用另一个字典的kv对更新本字典
key不存在,就添加
key存在,覆盖已经存在的key对应的值
就地修改

In [48]: d
Out[48]: {‘a’: 100, ‘b’: 10, (1, 3, 4): {1, 3, 5, 6}}

In [49]: d1 = {‘c’:68}

In [50]: d.update(d1)

In [51]: d
Out[51]: {‘c’: 68, ‘a’: 100, ‘b’: 10, (1, 3, 4): {1, 3, 5, 6}}

In [51]: d
Out[51]: {‘c’: 68, ‘a’: 100, ‘b’: 10, (1, 3, 4): {1, 3, 5, 6}}

In [52]: d.update(f = 2)

In [53]: d
Out[53]: {‘f’: 2, ‘c’: 68, ‘a’: 100, ‘b’: 10, (1, 3, 4): {1, 3, 5, 6}}

In [53]: d
Out[53]: {‘f’: 2, ‘c’: 68, ‘a’: 100, ‘b’: 10, (1, 3, 4): {1, 3, 5, 6}}

In [54]: d.update(f = 5)

In [55]: d
Out[55]: {‘c’: 68, ‘a’: 100, (1, 3, 4): {1, 3, 5, 6}, ‘b’: 10, ‘f’: 5}

In [56]: d.update({‘x’:2})

In [57]: d
Out[57]: {‘c’: 68, ‘a’: 100, (1, 3, 4): {1, 3, 5, 6}, ‘x’: 2, ‘b’: 10, ‘f’: 5}

### 字典删除
pop(key[,default])
key存在,移除,返回其value
key不存在,返回给定的default
default未设置,key不存在,抛出KeyError异常

In [58]: d.pop(‘f’)
Out[58]: 5

In [59]: d
Out[59]: {‘c’: 68, ‘a’: 100, (1, 3, 4): {1, 3, 5, 6}, ‘x’: 2, ‘b’: 10}

popitem()
移除并返回一个任意的键值对
字典为empty,抛出KeyError异常

In [61]: d.popitem()
Out[61]: (‘c’, 68)

In [62]: d
Out[62]: {‘a’: 100, (1, 3, 4): {1, 3, 5, 6}, ‘x’: 2, ‘b’: 10}

clear()
清空字典

In [63]: d.clear()

In [64]: d
Out[64]: {}

### 字典删除
del语句
In [65]: a = True

In [66]: b = [6]

In [67]: d = {‘a’:1,’b’:b,’c’:[1,2,3]}

In [68]: del a

In [69]: d
Out[69]: {‘a’: 1, ‘b’: [6], ‘c’: [1, 2, 3]}

In [71]: del d[‘c’] #删除key,对应的value也就不存在了

In [72]: d
Out[72]: {‘a’: 1, ‘b’: [6]}

In [72]: d
Out[72]: {‘a’: 1, ‘b’: [6]}#删除b[0],删除b中索引为0的元素

In [73]: del b[0]

In [74]: d
Out[74]: {‘a’: 1, ‘b’: []}

In [76]: del c

In [77]: del b

In [78]: d
Out[78]: {‘a’: 1, ‘b’: []}

In [79]: b = d[‘b’]

In [80]: d
Out[80]: {‘a’: 1, ‘b’: []}

In [81]: b
Out[81]: []

备注:del a[‘c’]看着像删除了一个对象,本质上减少了一个对象的引用,del实际删除的是名称,而不是对象

### 字典遍历

for … in dict
遍历item,即kv对

In [84]: for item in d.items():
…: print(item)
…:
(‘a’, 1)
(‘b’, [])

In [85]: for k,v in d.items():
…: print(k,v)
…:
a 1
b []

遍历value
for k in d:
print(d[k])

for k in d.keys():
print(d.get(k))

遍历key
In [1]: d = {‘a’:1,’b’:2,’c’:3}

In [2]: for v in d.keys():
…: print(v)
…:
a
b
c

In [6]: for i in d:
…: print(i)
…:
…:
a
b
c

解构:
In [7]: for k,_ in d.items():
…: print(k)
…:
a
b
c

In [8]: for _,v in d.items():
…: print(v)
…:
1
2
3

也有for k,[_,v] in d.items()等多种变化用法

总结:
Python3中,keys、values、items方法返回一个类似一个生成器的可迭代对象,不会把函数的返回结果复制到内存中

Python2中,上面的方法会返回一个新的列表,占据新的内存空间。所以Python2建议使用iterkey、itervalues、iteritems版本,返回一个迭代器,而不是一个copy

### 字典的key
key的要求和set的元素要求一致
hashable可哈希才可以作为key
In [1]: d = {1:0,2.0:3,”abc”:None,(‘Hello’,’world’,’python’):”string”,b’abc’:’135′}

In [2]: d
Out[2]:
{(‘Hello’, ‘world’, ‘python’): ‘string’,
1: 0,
2.0: 3,
‘abc’: None,
b’abc’: ‘135’}

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

In [1]: from collections import defaultdict

In [2]: d1 = {}

In [3]: d2 = defaultdict(list)

In [4]: for k in “abcde”:
…: for v in range(5):
…: if k not in d1.keys():
…: d1[k] = []
…: d1[k].append(v)
…: print(d1)
…:
{‘a’: [0, 1, 2, 3, 4], ‘b’: [0, 1, 2, 3, 4], ‘e’: [0, 1, 2, 3, 4], ‘d’: [0, 1, 2, 3, 4], ‘c’: [0, 1, 2, 3, 4]}

In [8]: for i in ‘mnopq’:
…: for v in range(3):
…: d2[i].append(v)
…: print(d2)
…:
defaultdict(<class ‘list’>, {‘p’: [0, 1, 2], ‘n’: [0, 1, 2], ‘m’: [0, 1, 2], ‘q’: [0, 1, 2], ‘o’: [0, 1, 2]})

### OrderedDict
collections.OrderedDict([items])
key并不是按照加入的顺序排列,可以使用OrderedDict记录顺序

from collections import OrderedDict
In [9]: from collections import OrderedDict

In [10]: import random

In [11]: d = {‘banana’:3,’apple’:4,’pear’:1,’orange’:2}

In [12]: print(d)
{‘pear’: 1, ‘orange’: 2, ‘apple’: 4, ‘banana’: 3}

In [13]: keys = list(d.keys())

In [14]: random.shuffle(keys)

In [15]: print(keys)
[‘pear’, ‘banana’, ‘apple’, ‘orange’]

In [16]: od = OrderedDict()

In [17]: for key in keys:
…: od[key] = d[key]
…: print(od)
…: print(od.keys())
…:
OrderedDict([(‘pear’, 1), (‘banana’, 3), (‘apple’, 4), (‘orange’, 2)])
odict_keys([‘pear’, ‘banana’, ‘apple’, ‘orange’])

OrderedDict:
1、有序字典可以记录元素插入的顺序,打印的时候也是按照这个顺序输出打印
2、3.6版本的Python的字典就是记录key插入的顺序

## 关于盐和hash的问题,以后可以深入了解一下。

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

(0)
泰谷子泰谷子
上一篇 2017-10-09
下一篇 2017-10-09

相关推荐

  • 8.5文本处理工具及正则表达式

    一、各种文本工具     文件查看     命令:cat,tac,rev         cat optiong file       &n…

    Linux干货 2016-08-10
  • 自动化系统安装之DHCP服务实现

    DHCP服务实现 dhcp的工作过程是基于UDP协议的,其中用到了UDP的67(服务器),68(客户端)端口 使用场景 自动化安装系统 解决IPV4资源不足的问题 同网段多dhcp服务 dhcp服务必须基于本地 先到先得 跨网段 RFC 1542 dhcpclient客户端向dhcpsercer服务器请求续约时,中间相隔多网段时,如果路由器是 RFC1542…

    2018-01-29
  • bash脚本编程之算术运算和文件查找

    算数运算在每个编程语言里面是最基本的功能,在bash里面也是.相对于其他编程语言来说在bash里面不能直接以变量加上变量的形式来表现;比如我们先声明两个变量num1和num2然后再做运算。 num1=2 num2=3 echo "$num1+$num2" 2+3 这里我们显示的结果直接为2+3只是做了变量的替换,而不是做两个变量…

    Linux干货 2016-12-23
  • 8.网络基础知识

    1、请描述网桥、集线器、二层交换机、三层交换机、路由器的功能、使用场景与区别。 网桥:网桥就是把2个不同的网段桥接起来;可隔离冲突域。 集线器:集线器就是把多根以太网线或光纤集合连接在同一段物理介质下的装置;工作在物理层;不能隔离冲突域。 二层交换机:工作于OSI模型的第2层(数据链路层),故而称为二层交换机。二层交换技术的发展已经比较成熟,二层交换机属数据…

    Linux干货 2017-08-21
  • Linux发行版的基础目录名称、功能及目录的命名法则

    Linux发行版的基础目录名称、功能及目录的命名法则 基础目录名称及功能 /lib 32位系统的基础共享库文件和可装载的内核模块,用于为/bin和/sbin下的程序提供共享库,并为内核提供内核模块 /lib64 64位系统的基础共享库文件,用于为/bin和/sbin下的程序提供共享库 /etc 系统程序的配置文件 /bin 用户命令的程序文件,所有用户可用 …

    Linux干货 2017-07-02
  • ifcfg, ip, ss,配置文件 (Blog 7)

    Linux主机接入网络:
    IP/MASK
    GATEWAY
    DNS

    Linux干货 2017-11-27