一、字典

定义:d={key1:value1,key2:value2}或dict(a=1,b=2,c=3)/{‘a’:1,‘b’:2,‘c’:3}
注:key:键(必须是不可变对象,如数字,字符串,元组),value:值。建立起映射关系之后称为一个键值对。key不可重复,value可以重复。若键重复,后面的键值对会替换前面的。
注:一种可变容器模型,且可以存储任意类型的对象
注:字典的长度=字典中键值对的个数

通过键查找值
>>> d={"Name":"Blake","Age":21,"Nationality":"China"}
>>> d["Name"]
'Blake'
修改值
>>> d={"Name":"Blake","Age":21,"Nationality":"China"}
>>> d["Age"]=22
>>> d
{'Name': 'Blake', 'Age': 22, 'Nationality': 'China'}
删除键值对
>>> d
{'Name': 'Blake', 'Age': 22, 'Nationality': 'China'}
>>> del d["Age"] #删除键是Age的条目
>>> d
{'Name': 'Blake', 'Nationality': 'China'}
>>> d.clear()    #清空字典所有条目
>>> d
{}

注:22 in d是查22是不是作为字典中的键的key,不支持查值是否存在于字典里面

字典的方法

(1)查找值是否在字典内

>>> d={"name":"blake","age":21,"nationality":"china"}
>>> d['name']
'blake'
>>> d['birthday']
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
KeyError: 'birthday'

当字典内有对应键则返回值,若没有则会报错。
2.若用get方法,**d.get(‘birthday’)**不存在时放回NULL,也可以指定返回值。即 d.get(‘birthday’,‘none’)

3.d.setdefault(key,default=None,/)

>>> d={"name":"blake","age":21,"nationality":"china"}
>>> d.setdefault("birthday")
>>> d
{'name': 'blake', 'age': 21, 'nationality': 'china', 'birthday': None}

default方法如果键不在字典内,会插入一个新键值对,值默认为None。且default默认返回值也为None
(2)字典中增加键值对的方法

>>> d.update([("hobby","basketball"),("gender","male")])
>>> d
{'name': 'blake', 'age': 21, 'nationality': 'china', 'birthday': None, 'hobby': 'basketball', 'gender': 'male'}
>>> d1={"city":"Nanjing"}
>>> d.update(d1)
>>> d
{'name': 'blake', 'age': 21, 'nationality': 'china', 'birthday': None, 'hobby': 'basketball', 'gender': 'male', 'city': 'Nanjing'}

(3)字典中删除键值对的方法

>>> d.pop("nationality")
'china'
>>> d
{'name': 'blake', 'age': 21, 'birthday': None, 'hobby': 'basketball', 'gender': 'male', 'city': 'Nanjing'}
>>> d.pop("nationality","noexist")
'noexist'

pop函数删除指定键值对,若指定的键不存在,为了不让他报错,可以返回指定的值。
popitem则是删除字典内的最后一个键值对,并且返回他

比较字典和列表的异同

字典不是序列,所以没有像列表一样的索引。但是字典和索引都是容器类对象,即由一些元素组成,元素的改变不会影响整体(内存地址)。

二、集合

可变集合的定义

可变对象如列表不能作为集合中的元素
(1)用 set函数来定义集合

>>> s=set([1,2,3,3,2,1,4])
>>> s
{1, 2, 3, 4}

(2)花括号方式标记集合

>>> s2={"blake",1,2,3}
>>> s2
{1, 2, 3, 'blake'}

(3)add函数z在集合中增加元素

>>> s2.add("china")
>>> s2
{1, 2, 3, 'china', 'blake'}

(4)pop函数在集合中删除元素

>>> s2.pop()
1
>>> s2
{2, 3, 'china', 'blake'}
>>> s2.pop()
2
>>> s2
{3, 'china', 'blake'}

(5)remove函数在集合中删除指定元素

>>> s2={3,"china","blake"}
>>> s2.remove(3)
>>> s2
{'china', 'blake'}

discard函数也是删除指定元素,但是他删除集合中不存在的元素不会报错,而remove会报错。

不可变集合的定义

用frozenset方法定义

>>> f_set=frozenset("blake")
>>> f_set
frozenset({'e', 'b', 'a', 'l', 'k'})

list、dict、set三种类型的copy方法都是shallow copy

>>> b1=["name",123,["python","php"]]
>>> b2=b1.copy()
>>> b2
['name', 123, ['python', 'php']]
>>>
>>> b1 is b2
False
>>> b1[0]is b2[0]
True
>>> b1[0]=100
>>> b1
[100, 123, ['python', 'php']]
>>> b2
['name', 123, ['python', 'php']]
>>> b1[2][0]=999
>>> b1
[100, 123, [999, 'php']]
>>> b2
['name', 123, [999, 'php']]

怎么实现deepcopy

>>> import copy
>>> b1
[100, 123, [999, 'php']]
>>> b3=copy.deepcopy(b1)
>>> b3
[100, 123, [999, 'php']]
>>> b1[2][0]="java"
>>> b1
[100, 123, ['java', 'php']]
>>> b3

集合的关系

(1)元素和集合的关系

>>> s=set("python")
>>> s
{'y', 'n', 'h', 'p', 'o', 't'}
>>> 'a'in s
False
>>> 'y'in s
True

(2)集合与集合之间的关系和集合之间的运算

1.集合之间的关系

>>> a=set([1,2,3,4,5])
>>> b=set([1,2,3])
>>> a.issuperset(a)
True
>>> b.issubset(a)
True

2.集合之间的运算(交、并、差)

>>> a
{1, 2, 3, 4, 5}
>>> b
{1, 2, 3}
>>> a|b
{1, 2, 3, 4, 5}
>>> a.union(b)
{1, 2, 3, 4, 5}
>>> a&b
{1, 2, 3}
>>> a.intersection(b)
{1, 2, 3}
>>> a-b
{4, 5}
>>> a.difference(b)
{4, 5}