dict and set

今日总结

一、dict

1、增、改

字典[key] = 值

如果key存在的时候是修改指定key对应的值,当key不存在的时候添加键对值

dog = {'name': '财财', 'age': 2, 'breed': '土狗'}
print(dog)      # {'name': '财财', 'age': 2, 'breed': '土狗'}

dog['gender'] = '母狗'
print(dog)      # {'name': '财财', 'age': 2, 'breed': '土狗', 'gender': '母狗'}

dog['breed'] = '中华田园犬'
print(dog)      # {'name': '财财', 'age': 2, 'breed': '中华田园犬', 'gender': '母狗'}

dog['age'] = 3
print(dog)      # {'name': '财财', 'age': 3, 'breed': '中华田园犬', 'gender': '母狗'}

2、删

1) del 字典[key]

删除字典中指定key对应的键值对

dog = {'name': '财财', 'age': 3, 'breed': '中华田园犬', 'gender': '母狗'}
del dog['gender']
print(dog)      # {'name': '财财', 'age': 3, 'breed': '中华田园犬'}
2) 字典.pop(key)

取出字典中指定key对应的值(对应key也无法保存)

dog = {'name': '财财', 'age': 3, 'breed': '中华田园犬', 'gender': '母狗'}
result = dog.pop('age')
print(dog, result)      # {'name': '财财', 'breed': '中华田园犬', 'gender': '母狗'} 3

3、字典相关操作

1) 字典不支持 +、*、 和 比较大小,只支持比较是否相等
2) in 和 not in

判断字典中是否存在指定的key

print('a' in {'name': 'a', 'age': 8})       # False  后面的字典中没有'a'这个key
3) dict、len

dict(数据)

将数据转换成字典

  • 数据必须是序列
  • 序列中元素必须是小序列,而且小序列有且只有两个元素(键值对),第一个元素不可变的
list1 = [(10, 20), 'ab', range(2)]
print(dict(list1))      # {10: 20, 'a': 'b', 0: 1}

字典也可转换成列表

dog = {'name': '财财', 'age': 3, 'breed': '中华田园犬', 'gender': '母狗'}
result = list(dog)
print(result)   # ['name', 'age', 'breed', 'gender']  字典转列表只取key

len(字典)

计算字典中元素个数

dog = {'name': '财财', 'age': 3, 'breed': '中华田园犬', 'gender': '母狗'}
print(len(dog))     # 4

4、字典推导式

{表达式1:表达式2 for 变量 in 序列}
{表达式1:表达式2 for 变量 in 序列 if 条件语句}
result = {x: x*2 for x in range(3)}
print(result)       # {0: 0, 1: 2, 2: 4}

result = {x: None for x in ['name', 'age', 'gender']}
print(result)       # {'name': None, 'age': None, 'gender': None}

dog = {'name': '财财', 'age': 3, 'breed': '中华田园犬', 'gender': '母狗'}
result = {dog[x]: x for x in dog}
print(result)
dict(表达式 for 变量 in 序列)

表达式必须是有且只有唯一两个元素

dog = {'name': '财财', 'age': 3, 'breed': '中华田园犬', 'gender': '母狗'}
result = dict((dog[x], x) for x in dog)
print(result)

5、字典相关方法

1) 字典.clear()

清空字典

og = {'name': '财财', 'age': 3, 'breed': '中华田园犬', 'gender': '母狗'}
dog.clear()
print(dog)      # {}
2) 字典.copy()

复制字典产生一个一模一样的新字典

dog = {'name': '财财', 'age': 3, 'breed': '中华田园犬', 'gender': '母狗'}
dog1 = dog
dog2 = dog.copy()
print(dog1)     # {'name': '财财', 'age': 3, 'breed': '中华田园犬', 'gender': '母狗'}
print(dog2)     # {'name': '财财', 'age': 3, 'breed': '中华田园犬', 'gender': '母狗'}

dog.clear()
print(dog, dog1, dog2)      # {} {} {'name': '财财', 'age': 3, 'breed': '中华田园犬', 'gender': '母狗'}
3) (了解)dict.fromkeys(序列)

创建一个字典,将序列中所有的元素作为字典key,默认值是none

result = dict.fromkeys('abcd')
print(result)       # {'a': None, 'b': None, 'c': None, 'd': None}

result = dict.fromkeys(['name', 'age', 'gender'], 100)
print(result)       # {'name': 100, 'age': 100, 'gender': 100}
4) values、keys、items
字典.values()

获取字典中所有的值;返回的不是列表而是另一种序列

字典.keys()

获取字典中所有的键;返回的不是列表而是另一种序列

字典.items()

获取字典中键值对;返回的时候序列,序列中的元素是每个键值对对应的元组

dog = {'name': '财财', 'age': 3, 'breed': '中华田园犬', 'gender': '母狗'}
result = dog.values()
print(result)   # dict_values(['财财', 3, '中华田园犬', '母狗'])
print(list(result))     # ['财财', 3, '中华田园犬', '母狗']

print(dog.keys())   # dict_keys(['name', 'age', 'breed', 'gender'])

print(dog.items())  # dict_items([('name', '财财'), ('age', 3), ('breed', '中华田园犬'), ('gender', '母狗')])


for x in dog.items():
    print(x)
    

for x, y in dog.items():
    print('x:', x, 'y', y)

5) 字典.setdefault(key, value)

在字典中添加键值队(不会在key存在的时候修改)

dog = {'name': '财财', 'age': 3, 'breed': '中华田园犬', 'gender': '母狗'}
dog.setdefault('weight', 20)
print(dog)      # {'name': '财财', 'age': 3, 'breed': '中华田园犬', 'gender': '母狗', 'weight': 20}

如果key存在时不会修改也不增加

dog.setdefault('name', '小黑')
print(dog)      # {'name': '财财', 'age': 3, 'breed': '中华田园犬', 'gender': '母狗', 'weight': 20}
6) 字典.update(序列)

将序列中所有的元素作为键值对添加到字典中。序列必须是可以转换成字典的序列

字典1.update(字典2)

将字典2中的键值对全部添加到字典1中

dict1 = {'a': 10}
dict1.update({'b': 20, 'c': 30})
print(dict1)        # {'a': 10, 'b': 20, 'c': 30}

二、集合

1、什么是集合

集合是容器型数据类型;将{}作为容器的标志,多个元素之间用逗号隔开{元素1, 元素2, 元素3, …}

集合是可变的;集合是无序的

元素:必须是不可变的数据;元素是唯一的

空集合:{}不是空集合,是空字典

set1 = set()
print(type(set1), len(set1))        # <class 'set'> 0

集合是无序

print({1, 2, 3} == {2, 3, 1})       # True

集合的元素是不可变的类型的数据

set2 = {23, 'abc', (2, 3)}
print(set2)     # {(2, 3), 'abc', 23}

# set2 = {23, 'abc', [2, 3]}
# print(set2)     # 报错!TypeError: unhashable type: 'list'   列表是可变的

集合的元素是唯一的

set4 = {10, 20, 30, 10, 20, 90, 20}
print(set4)     # {10, 20, 90, 30}

集合自带去重功能,但是只能去元素是不可变的序列的重复

names = ['张三', '李四', '王二', '李四', '张三', '张三']
print(set(names))       # {'张三', '李四', '王二'}

2、增删改查

1) 查

集合只能遍历(无法查单个和切片)

boll = {'乒乓球', '篮球', '羽毛球', '高尔夫', '网球'}
for x in boll:
    print(x)    # 无序取出集合中全部元素
2) 增

集合.add(元素) - 在集合中添加指定元素

boll.add('足球')
print(boll)     # {'篮球', '羽毛球', '足球', '乒乓球', '网球', '高尔夫'}

集合.update(序列) - 将序列中的元素全部添加在集合中

set5 = set()
set5.update('abc')
print(set5)     # {'b', 'c', 'a'}

set5.update({'name': '小左', 'age': '19'})
print(set5)     # {'name', 'age', 'c', 'b', 'a'}  增加字典中的键
3) 删

集合.remove(元素) - 删除指定元素,如果元素不存在报错

oll = {'乒乓球', '篮球', '羽毛球', '高尔夫', '网球'}
boll.remove('高尔夫')
print(boll)     # {'网球', '羽毛球', '篮球', '乒乓球'}

集合.discard(元素) - 删除指定元素,如果元素不存在不报错

boll.discard('网球')
print(boll)     # {'乒乓球', '篮球', '羽毛球'}

# boll.remove('桌球')     # 报错!KeyError: '桌球'
boll.discard('桌球')      # {'篮球', '乒乓球', '羽毛球'}  不报错

3、数学集合运算

交集、并集、差集、对称差集、子集、和真子集

s1 = {1, 2, 3, 4, 5, 6, 7}
s2 = {5, 6, 7, 8, 9}
1) 交集:&

集合1 & 集合2 - 获取两个集合公共的部分

print(s1 & s2)      # {5, 6, 7}
2) 并集:|

集合1 | 集合2 - 获取两个集合全部的部分

print(s1 | s2)      # {1, 2, 3, 4, 5, 6, 7, 8, 9}
3) 差集:-

集合1 - 集合2 - 获取在集合1中但是不在集合2中的所有的元素

print(s1 - s2)      # {1, 2, 3, 4}

集合2 - 集合1 - 获取在集合2中但是不在集合1中的所有的元素

print(s2 - s1)      # {8, 9}
4) 对称差集:^

集合1 集合2 - 获取只在集合1和只在集合2中所有的元素

print(s1 ^ s2)      # {1, 2, 3, 4, 8, 9}
5) 子集 和 真子集

集合1 >= 集合2 - 判断集合2是否是集合1的子集

集合1 > 集合2 - 判断集合2是否是集合1的真子集

print({100, 200, 300} >= {1, 2})        # False (没有比较大小)
print({1, 2, 3, 100, 200, 300} >= {1, 2})       # True

4、集合相关操作

1) in 和 not in
print((10 in {1, 10, 20}))      # True
2) max、min、sorted、set、len
print(max({10, 97, 85}))        # 97
print(sorted({10, 97, 85}))     # [10, 85, 97]
print(sum({10, 97, 85}))        # 192

print(len({10, 97, 85}))        # 3

作业

1.用三个集合表示三门学科的选课学生姓名(一个学生可以同时选多门课)

set1 = {'小明', '小红', '小黄', '小蓝', '小绿'}
set2 = {'小明', '小蓝', '小绿', '小白', '小青', '小橙'}
set3 = {'小橙', '小天', '小门', '小明'}

a. 求选课学生总共有多少人

print(len(set1 | set2 | set3))

b. 求只选了第一个学科的人的数量和对应的名字

print('只选了第一科的人数:', len(set1 - set2 - set3), '姓名:', (set1 - set2 - set3))

c. 求只选了一门学科的学生的数量和对应的名字

a = (set1 ^ set2 ^ set3) - (set1 & set2 & set3)
print('只选一门课人数:', len(a), '姓名:', a)

d. 求只选了两门学科的学生的数量和对应的名字

s = (set1 | set2 | set3)
a = (set1 ^ set2 ^ set3) - (set1 & set2 & set3)
b = (set1 & set2 & set3)
c = s - a - b
print('只选两门课人数', len(c), '姓名:', c)

e. 求选了三门学生的学生的数量和对应的名字

 print('选了三科的人数:', len(set1 & set2 & set3), '姓名:', (set1 & set2 & set3))
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值