人工智能之Python08 dict和set

python提供了dict和set数据集合,dict跟java的Map类似,一样的key-value键值对。

dict

字典是Python中唯一的映射类型,映射是数学上的一个术语,指两个元素集之间元素相互对应关系。

赋值

如果要实现一个’姓名’-成绩 的key-value键值映射,可以使用dict实现,无论有多少学生,当查找学生得分都可以很快速查找到。

score = {'zhangsan':90,'lisi':30,'wangwu':100,'zhaoliu':60}
print(score['zhaoliu']

dict的查询非常快速,原因:这种key-value存储方式,在放进去的时候,必须根据key算出value的存放位置,这样,取的时候才能根据key直接拿到value。

除了初始化将数据放入dict,还可以通过key的方式放入dict中

score['heqi'] = 99

key在dict中是唯一的,后放入的会覆盖之前的同名key值。

score['heqi'] = 88
score['heqi']

get、setdefault

如果获取一个不存在的key,python会报错。

score['songba']

判断此key是否存在于dict中,可使用 key in dict判断或者使用dict提供的get判断

'songba' in score
score.get('songba') # 如果不存在,返回None
score.get('songba','-1') # 如果不存在,返回-1

要删除一个key,用pop(key)方法,对应的value也会从dict中删除:

print('正在删除key:lisi')
score.pop('lisi')
print(score)

dict可以用在需要高速查找的很多地方,在Python代码中几乎无处不在,正确使用dict非常重要,需要牢记的第一条就是dict的key必须是不可变对象。

这是因为dict根据key来计算value的存储位置,如果每次计算相同的key得出的结果不同,那dict内部就完全混乱了。这个通过key计算位置的算法称为哈希算法(Hash)。

要保证hash的正确性,作为key的对象就不能变。在Python中,字符串、整数等都是不可变的,因此,可以放心地作为key。

setdefault()方法和get()方法有点类似,但是setdefault()在字典中找不到相应的键会自动添加

dict01 = {1:"1",2:"2",3:"3"}

print(dict01.setdefault(4))
print(dict01)

# 输出
None
{1: '1', 2: '2', 3: '3', 4: None}

fromkeys

fromkeys方法用于创建并返回一个新的字典,他有两个参数-第一个参数是字典的键;第二个参数是可选的,是传入键对应的值。如果不提供,那么默认是None

dict01 = {}
print("dict01 是:%s" % (dict01.fromkeys((1,2,3))))

dict02 = {}
print("dict02 是:%s" % (dict02.fromkeys((1,2,3),"Number")))


dict03 = {}
print("dict03 是:%s" % (dict03.fromkeys((1,2,3),("one","two","three"))))

## 输出是
dict01 是:{1: None, 2: None, 3: None}
dict02 是:{1: 'Number', 2: 'Number', 3: 'Number'}
dict03 是:{1: ('one', 'two', 'three'), 2: ('one', 'two', 'three'), 3: ('one', 'two', 'three')}

keys、values、items

访问字典的方法有keys、values、items。

  1. keys()返回字典中的键
  2. values()返回字典中所有的值
  3. items()返回字典中的键值对

copy

copy()方法是复制字典

dict01 = {1:"1",2:"2",3:"3"}
dict02 = dict01.copy()

print("dict01是:%s" % dict01)
print("dict02是:%s" % dict02)

# 输出是
dict01是:{1: '1', 2: '2', 3: '3'}
dict02是:{1: '1', 2: '2', 3: '3'}

pop、popitem

  1. pop()是给定键弹出对应的值
  2. popitem()是弹出一个项
dict01 = {1:"1",2:"2",3:"3"}

print(dict01.pop(1))
print(dict01.popitem())
# 输出是
1
(3, '3')

update

可以利用它来更新字典

dict01 = {1:"1",2:"2",3:"3"}
dict01.update({1:5})
print(dict01)

# 输出是
{1: 5, 2: '2', 3: '3'}

集合

set

Python的字典是对数学中映射概念支持的直接表现,下面介绍字典的表亲:集合

set和dict类似,也是一组key的集合,但不存储value。由于key不能重复,所以,在set中,没有重复的key。

对比一下dict和set

dict01 = {}
print(type(dict01))
set01 = {1,2,3,4,3,2,1}
print(type(set01))
print(set01)

# 输出是
<class 'dict'>
<class 'set'>
{1, 2, 3, 4}

可以看出 字典跟set的区别,而且set会自动去重

创建set

创建set有两种方式
1. 直接把一堆元素用大括号({})括起来;
2. 用set() 创建

score01 = set(range(1,6))
score02 = {1,2,3,4,5}
print(score01 == score02)

# 输出是
True

访问集合

由于集合中的元素是无序的,所以并不能像序列那样用下标来进行访问,但是可以使用迭代把集合中的数据一个个读取出来

def setFunc() :
    for i in range(1,11):
        print(i,end = ' ')
setFunc()

# 输出是
1 2 3 4 5 6 7 8 9 10 

判断集合是否存在元素

也可以使用in、not in判断一个元素是否再集合中已经存在

add

使用add方法可以为集合添加元素

remove

可以删除集合中已知的元素

score = set(range(1,6))
print(score)
score.add(4)
print('添加元素4')
print(score)

print('添加元素10')
score.add(10)
print(score)

#print('删除元素9-删除不存在的元素会报错')
#score.remove(9)
#print(score)

print('删除元素10')
score.remove(10)
print(score)

不可变集合

有些时候希望集合中的数据具有稳定性,也就是像元组一样不能随意的增加或者删除集合中的元素。那么可以使用frozenset()定义不可变集合

猜你喜欢

转载自blog.csdn.net/u012806787/article/details/79317346