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/87716

联系我们

400-080-6560

在线咨询

工作时间:周一至周五,9:30-18:30,节假日同时也值班

QR code