字典的成员资格判断 in / not in 运算符
用 in 运算符可以判断一个键是否存在于字典中,如果存在则返回True,否则返回False
not in 返回值与 in 相反
示例:
d = {1: "一", 2: "二"}
1 in d # True
2 in d # True
2 not in d # False
8 not in d # True
8 in d # False
'一' in d # False
列表的 in 运算符和字典的 in 运算符比较:
1. 列表的in运算符计算时间会因列表中元素个数的增加而增加
L = [3,7,0,1,4,5,6....... 10976] # 大约有十万个
if 888 in L:
print("888在列表里") # 慢
2. 字典的in运算符计算时间不会因键值对的个数增加而增加,操作速度快于列表
d = {3: "三", 7: "xx", 0: None, ... 10976:None}
if 888 in d:
print("888在字典的键里") # 快
字典的迭代访问:
容器是可迭代对象,字典只能对键进行迭代访问
d = {'name': '小张', 'birthday': (2008,8,8)}
for k in d:
print(k)
可以用于字典的内建(built-in)函数:
len(x) 返回字典的键值对的个数
max(x) 返回字典的键的最大值
min(x) 返回字典的键的最小值
sum(x) 返回字典的所有键的和
any(x) 对所有键进行真值测试,有一个为True结果为True
all(x) 对所有键进行真值测试,所有为True才为True
字典的方法:
见:
>>> help(dict)
或
file: python_base_docs_html/dict_xxxx.html
练习:
输入一个字符串代表星期几(0~6), "0"/'日'代表周日,'1'/'一' 代表周一.
'2'/'二' 代表周二.......... '6'/'六' 代表 周六
任意输入字符串,打印这个字符串是否代表星期几,如果不是以上字符打印"字典内没有相应的数据"
(要求将以上数据存于字典中, 键为字符串:'0123456日一二三...六'中的一个,值为星期几或周几)
d = {
'0': "星期天",
'日': "星期天",
'1': "星期一",
.....
}
字典推导式:
作用:
用可迭代对象生成字典
语法:
{键表达式 : 值表达式 for 变量 in 可迭代对象 [if 真值表达式]}
注: []的内容代表可省略
示例:
# 生成一个字典,键为10以内的数字,值为键的平方
d = {x : x ** 2 for x in range(10)}
练习:
1. 有字符串列表如下:
L = ["tarena", 'xiaozhang', 'hello']
用推导式生成如下字典:
d = {"tarena":6, 'xiaozhang':9, 'hello':5}
注: 字典的值为键的长度
2. 有两个列表:
no = [1001, 1002, 1003, 1004]
names = ['Tom', 'Jerry', 'Spike', 'Tyke']
用no中的编码为作为键,以names中的字符串作为值,生成相应的字典
提示 : range(4)来生成索引
字典推导式的嵌套:
语法同列表推导式嵌套
字典 VS 列表
1. 都是可变对象
2. 索引方式不同, 列表用整数索引,字典用键索引
3. 字典的查找速度可能会快于列表(重要)
4. 列表的存储是有序的,字典的存储是无序的
集合 set
集合是可变的容器
集合内的数据对象都是唯一的(不能重复多次的)
集合是无序的存储结构,集合中的数据没有先后顺序关系
集合内的元素必须是不可变对象
集合是可迭代对象
集合是相当于只有键没有值的字典(键则是集合的数据)
创建空的集合:
set()
创建非空的集合:
s = {1, 2, 3, 4}
集合的构造函数 set
set() 创建一个空的集合对象(不能用{}来创建空集合)
set(iterable) 用可迭代对象创建一个新的集合对象
示例:
s = set() # s 为空集合
s = {3,5,7,9}
s = set("ABC") # s = {'A', 'B', 'C'}
s = set({1:'1', 2:"2", 5:'5'}) # s = {1,2,5}
s = set(range(1:10:3)) # s = {1,4,7}
集合的运算:
交集, 并集,补集,子集,超集
运算符:
& | - ^ < <= > >= == !=
in / not in
& 生成两个集合的交集
s1 = {1, 2, 3}
s2 = {2, 3, 4}
s1 & s2 # {2, 3}
| 生成两个集合的并集
s1 = {1, 2, 3}
s2 = {2, 3, 4}
s1 | s2 # {1, 2, 3, 4}
- 生成两个集合的补集
s1 = {1, 2, 3}
s2 = {2, 3, 4}
s1 - s2 # {1} #生成属性s1但不属于s2的所有元素的集合
^ 生成两个集合的对称补集
s1 = {1, 2, 3}
s2 = {2, 3, 4}
s1 ^ s2 # {1, 4}
> 判断一个集合是另一个集合的超集
< 判断一个集合是别一个集合的子集
{1, 2, 3} > {1, 2} # True
{2, 3, 1} > {3, 2} # True
{2, 3, 4} < {1, 2, 3, 4} # True
== / != 集合相同和不同
{1, 2, 3} == {3, 2, 1} # True
{1, 2, 3} != {2, 3, 4} # True
in / not in 运算符
in 等同于字典的in, 用于集合中,当某个值存在于集合中,返回True,否则返回False
not in 与 in 返回值相反
集合的 in / not in 运算符的速度快于序列
能用于集合的函数:
len(x)
max(x)
min(x)
sum(x)
any(x)
all(x)
集合是可迭代对象
集合练习:
经理有: 曹操,刘备,周瑜
技术员有: 曹操,周瑜,张飞,赵云
用集合求:
1. 即是经理也是技术员的有谁?
2. 是经理,但不是技术员的有谁?
3. 是技术人员,但不是经理的都有谁?
4. 张飞是经理吗?
5. 身兼一职的人都有谁?
6. 经理和技术员共有几个人?
python3 集合中的常用方法:
见:
>>> help(set)
或:
python_base_docs_html/set_????.html
集合推导式
集合推导式是用可迭代对象生成集合的表达式
语法:
{ 表达式 for 变量 in 可迭代对象 [if 真值表达式]}
注: [] 内的内容可省略
示例:
numbers = (1,2,3,2,2,3,3,4,5)
s = {x for x in numbers} # 去除重复的元素
固定集合 frozenset
固定集合是不可变的,无序的,含有不重复元素的集合
作用:
固定集合可以作为字典的键,还可以作为集合的值
创建空的固定集合
fs = frozenset()
创建非空的固定集合:
frozenset(iterable) 用可迭代对象创建新的固定集合
示例:
fz = frozenset([2,3,5,7]) # frozenset({2, 3, 5, 7})
运算:
& 交集
| 并集
- 补集
^ 对称补集
in /not in 运算
< <= > >= == !=
(以上运算 与 set 的运算完全相同)
固定集合的方法:
相当于集合的全部方法(去掉修改集合的方法)
列表 ,字典,集合对象优缺点:
1. 都为可变
2. 列表的尾部插入速度比较快,查中间插入和头插数据速度慢
3. 列表有序
4. 字典添加,删除,修改速度快于列表
5. 集合的添加,删除快于列表,且不能存储重复元素
练习:
1. 输入一段字符串,打印所有输入过的字符串,但重复的只打印一次,(不要求打印的顺序与输入顺序一致)
输入: abcdabcaba
打印:
a b c d
2. 输入一段字符串,打印出这个字符串中出现过的字符及出现过的次数:
如:
输入:abcdabcaba
打印如下:
a: 4次
b: 3次
d: 1次
c: 2次
注: 不要求打印顺序
练习:
1. 有一只小猴子,摘了很多桃.
第一天吃了全部桃子的一半,感觉不饱又吃了一个
第二天吃了剩下桃子的一半,感觉不饱又吃了一个
.... 以此类推
到第十天,发现只剩下一个了
请问第一天摘了多少个桃?
2. 完全数
1 + 2 + 3 = 6 (6为完全数)
1, 2, 3都为6的因数(能被一个数x整除的数为y,则y为x的因数)
1 x 6 = 6
2 x 3 = 6
完全数是指除自身以外的所有的因数之和相加等于自身的数
求 4 ~ 5个完全数,并打印出来
答案:
6
28
496
8128
3. 任意输入一个数n代表三角形的高度, 打印此形将的三角形
如:
请输入:4
打印如下:
1
121
12321
1234321
4. 将第三题打印三角形变为打印棱形
1
121
12321
1234321
12321
121
1