博客源为书写的载体,书写以对思维的缓存 正文

Python dict和set的使用


之前对列表(list)和元祖(tuple)进行了总结,这篇文章将讲讲字典(dict)和集合(set)的定义与使用。

一:dict(字典)

dict全称dictionary,是一种可变容器模型,可存储任意类型的对象。它是一个无序的"键值对"集合,类似于Java中的Map。

1.创建、删除、清空字典

1.创建一个字典,只要把逗号分隔的不同键值对的数据项使用大括号"{}"括起来即可,如:
>>> dict1 = {key1 : value1, key2 : value2}
>>> dict1 = {}    # 空字典
注意:
(1)字典中的key必须是唯一的,如果存在多个相同的key,最后的key及其对应的value会覆盖前面的。
  >>> dict1 = {"Bob":100, "Lucy":95, "Bob": 80}
  >>> dict1["Bob"]
  ... 80
(2)字典中的key必须是不可变类型,如:字符串、数字或元祖。
(3)字典中的value则可以是任何数据类型。

2.删除字典
>>> del dict1

3.清空字典
>>> dict1.clear()

2.增加元素

# 直接通过key来添加
>>> dict1 = {}
>>> dict1["Bob"] = 100
>>> dict1
... {"Bob":100}

3.删除元素

1.通过key来删除:pop(key),会返回被删除key所对应的value
>>> dict1 = {"Bob":100, "Lucy":95, "Tom":80}
>>> dict1.pop("Bob")
... 100
>>> dict1
... {"Lucy":95, "Tom":80}

2.通过key来删除:del
>>> dict1 = {"Bob":100, "Lucy":95, "Tom":80}
>>> del dict1["Lucy"]
>>> dict1
... {"Bob":100, "Tom":80}

4.修改元素

# 直接通过key来修改
>>> dict1 = {"Bob":100, "Lucy":95, "Tom":80}
>>> dict["Bob"] = 99
>>> dict1
... {"Bob":99, "Lucy":95, "Tom":80}

5.查询元素

# 直接通过key查询
>>> dict1 = {"Bob":99, "Lucy":95, "Tom":80}
>>> dict1["Tom"]
... 80

6.字典函数

   序号   
   函数   
   描述   
     1   len(dict)   计算字典元素个数,即键的总数。
     2   str(dict)   将字典类型转换为字符串类型。

7.字典方法

   序号   
   方法      描述   
     1   dict.copy()   复制字典(浅复制)
     2   dict.fromkeys(seq, val)   创建一个新字典,以序列seq中元素做字典的键,val为每个键对应的value
     3   dict.get(key, default)   返回指定key的对应的value,如果key不在字典中则返回default的值
     4   key in dict   判断字典中是否存在指定的key,如果存在返回true,否则返回false
     5   dict.items()   将dict中的每一对key和value转换为tuple,最后所有的tuple组装为一个list
     6   dict.keys()   将dict中的所有key作为一个迭代器返回,可用list()方法将迭代器转换为list类型
     7   dict.values()   将dict中的所有value作为一个迭代器返回,可用list()方法将迭代器转换为list类型
     8   dict.update(other_dict)   把其它字典other_dict中的键/值对更新到dict里
     9   dict.popitem()   随机删除字典中的一对键和值(一般删除末尾对)并返回该键值对。

二:set(集合)

set(集合)是一个无序不重复元素集,它和dict类似但只存储key不存储value。由于key不能重复,所以在set中没有重复的元素,并且只能存储不可变类型。

1.创建、删除、清空集合

1.创建集合使用大括号{ }或者set()函数,元素用逗号分隔,如:
>>> set1 = {1,2, 3}
>>> set1 = {(1, 2, 3)}    # 存储tuple
或者:
>>> set2 = set([1, 2, 3])
>>> set2
... {1, 2, 3}
>>> set3 = set((1, 2, 3))
>>> set3
... {1, 2, 3}
注意:使用set()函数创建集合时,需要使用[]或者()将元素进行包裹。
# 空集合
>>> s = set1()
注意:创建一个空集合必须用set()而不是{ },因为{ }是用来创建空字典的。

2.删除集合
>>> del set1

3.清空集合
>>> set1.clear()

2.添加元素

1.add(elem)
>>> set1 = set()
>>> set1.add("name")
>>> set1
... {'name'}
>>> set1.add((1, 2, 3))
>>> set1
... {'name', (1, 2, 3)}

2.update(elem)
>>> set1 = set()
>>> set1.update("name")
>>> set1
... {'e', 'a', 'n', 'm'}
注意:使用update()方法时,会将元素拆分,你需要使用[]将元素进行包裹。
>>> set1 = set()
>>> set1.update(["name"])
>>> set1
... {"name"}
ps:对于添加操作时,推荐你使用add()方法,因为update()用起来很难受。
1.添加字符串时会拆分每个字符
2.添加元祖时,同样会拆分开来
>>> set1 = set()
>>> set1.update((1,2,3))
>>> set1
... {1, 2, 3}
你必须使用[]包裹起来才能得到你想要的结果:
>>> set1.update([(1, 2, 3)])
>>> set1
... {(1, 2, 3)}
ps:update()很无辜,但是如果你想添加另一个set时,只能用update()。
>>> set1 = {1, 2, 3}
>>> set1.update({4, 5, 6})
>>> set1
... {1, 2, 3, 4, 5, 6}

3.删除元素

1.remove(elem):删除指定元素,如果该元素不存在,会报"KeyError"错误
>>> set1 = {1, 2, 3}
>>> set1.remove(3)
>>> set1
... {1, 2}

2.discard(elem):删除指定元素,如果该元素不存在,不会报错
>>> set1 = {"name"}
>>> set1.remove("name")
>>> set1
... set()

3.pop():随机删除某个元素并返回被删除的元素
>>> set1 = {1, 2, 3}
>>> set1.pop()
... 2

4.修改、查询元素

由于set存储的是无序key集合,所以我们没法通过索引来查询元素以及修改元素。但是我们可以通过遍历集合来获取集合中的元素或者通过"in"和"not in"这两个成员运算符来间接的查询元素。

1.for循环遍历
>>> set1 = {1,2, 3}
>>> for i in set1:
...     print(i)
... 1
... 2
... 3

2."in"和"not in"
>>> set1 = {1,2, 3}
>>> 3 in set1
... True
>>> 4 not in set1
... True

5.集合运算符

a = {"Bob", "Tom", "Lucy", "Jack"}          b = {"Mary", "Jack", "Bob", "Peter"}

 表达式   
 结果    描述   
 a - b {"Tom", "Lucy"} a和b的差集(在a中的元素但不在b中,也就是a-(a & b))
 a & b {"Bob", "Jack"} a和b的交集(两集合中相同的元素)
 a | b {"Bob", "Mary", "Lucy", "Tom", "Peter", "Jack"} a和b的并集(两集合的所有元素,相同的过滤)
 a ^ b {"Tom", "Lucy", "Mary", "Peter"} a和b中不重复的元素(交集取反)

6.集合函数&方法

序号
  方法  描述
  1  len(set1)
  获取集合中的元素个数(这是个函数)
  2  set.copy()
  拷贝一个集合
  3  set1.difference(set2, ...)  set1和set2的差集,等同于set1 - set2,可接收多个set并返回一个新的集合
  4  set1.intersection(set2, ...)
  set1和set2的交集,等同于set1 & set2,可接收多个set并返回一个新的集合
  5  set1.intersection_update(set2, ...)
  在set1的基础上移除不重叠的元素,只留下set1和set2的交集,可接收多个set
  6  set1.isdisjoint(set2)  判断两个集合是否包含相同的元素,如果没有返回True,否则返回False
  7  set1.issubset(set2)
  判断set1中的所有元素是否都包含在set2集合中,如果是返回True,否则返回False
  8  set1.issuperset(set2)
  判断set2中的所有元素是否都包含在set1集合中,如果是返回True,否则返回False
  9  set1.symmetric_difference(set2)
  返回两个集合中不重复的元素集合并返回一个新集合,等同于set1 ^ set2
 10  set1.union(set2, ...)
  集合的并集(相同的过滤),等同于set1 | set2,可接收多个set并返回一个新的集合

7.集合常见用法

由于set是一个无序不重复元素集,针对"不重复"这一特性,可以用来列表、元祖去重。

1.list去重
>>> list1 = [1, 2, 2, 3, 1]
>>> list2 = list(set(list1))
>>> list2
... [1, 3, 2]

2.tuple去重
>>> tuple1 = ("壹", "贰", "贰", "叁", "壹")
>>> tuple2 = tuple(set(tuple1))
>>> tuple2
... ("叁", "贰", "壹")

8.总结

作为有序派和无序派的代表,list和dict两者的区别如下:

1.list中的元素是通过偏移存取的,而字典当中的元素是通过键来存取的。
2.list查找和插入的时间会随着元素的增加而增加,dict查找和插入的速度极快,不会随着key的增加而增加。
3.list占用空间小,浪费内存很少。dict需要占用大量的内存,内存浪费多。
4.list可存储任意数据类型,而dict中的key必须为不可变类型的数据,value则任意类型。
5.list有序,dict无序。

关于list和tuple的详细介绍可参考我的:Python list和tuple的使用

三:最后

images.jpg