python笔记8
来源:互联网 发布:moto z force网络参数 编辑:程序博客网 时间:2024/06/01 07:48
2010/10/11
集合
1.字典的基本函数操作:
len(x) 返回字典的长度
max(x) 返回字典的键的最大值
min(x) 返回字典的键的最小值
sum(x) 返回字典中所有键的和
any(x) 真值测试,任意键为真,则返回True,否则返回False
all(x) 真值测试,所有键为真,则返回True,否则返回False
总结:所有的容器都支持以上的函数操作
实例:
d = {3:"333",8:"888",5:"555"}
len(d) #3
max(d) #8
min(d) #3
sum(d) #16
2.集合 set (help(set)可查) :
集合是可变的容器(目前学习到3种容器:列表,字典,集合);
集合内的数据对象都是唯一的(类比字典的键);
集合是无序的存储结构,集合中的数据没有先后关系(即输出时不一定按照输入的顺序);
集合是相当于只有键,没有值的字典,则键是集合的数据;
集合内的元素必须是不可变的对象(列表,字典,集合都不能放在集合里列表的值,字典中键的值均可以变化),如果赋值变化成集合,其数据集会按下实例发生一些列的数据变化,比如列表中重复的值将会去重,并将列表符号换成集合符号,而且需使用s = set([1,2,3,1])命令,不可以使用s = {1,2,3,4,2,1,1}命令
集合可迭代(可以用for等进行遍历)
(1)
生成集合:
生成空的集合:
set()
生成非空集合:
set(iterable)函数:
实例:
a = set([1,2,3,4]) #生成集合{ 1,2,3,4 }@@@@@@@@@@@@@@@@@@@@@@@@@@@@内部写为可迭代对象
a = { 1,2,3,4 } #生成集合{ 1,2,3,4 }@@@@@@@@@@@@@@@@@@@@@@@@@@@@大括号默认是字典,内部应为可迭代对象
a = set("xiaoyuxiu") #生成集合{'i', 'x', 'y', 'a', 'o', 'u'} 去重x,i !!!!!!!!!!!!!!!!!!!!!!!!!!!!!
a = set({"name":"tarena","age":15}) #生成集合{'name', 'age'} 只留下键!!!!!!!即如果不想拆开输入的字符串,就使用列表
a = set(("abc",123,True)) #{True, 123, 'abc'}
a = set(True,None,"abc",(1,2,3),3.14) #报错,应改
a = set((True,None,"abc",(1,2,3),3.14)) #{True, None, 3.14, 'abc', (1, 2, 3)} #输出无序,内部应为可迭代对象,列表或者元组或者字典
(2)
集合的运算:
交集,全集,补集,子集,超集
A = {1,2,3}
B = {2,3,4}
C = {1}
D = {100}
交集 = {1,2}
并集 = {1,2,3,4}
补集 A - B # {1} 等同于A减AB的交集
B - A # {4} 等同于B减AB的交集
A是C的超集,A不是D的超集
注意:
A - B == {} #False 左侧是集合,右侧是字典,永远不会相等,要使用set()!!!!!!!!!!!!!!!!!!!!
生成两个集合的并集
A = {1,2,3}
B = {2,3,4}
A | B #生成并集{1,2,3,4}
生成两个集合的并集
A = {1,2,3}
B = {2,3,4}
A & B #生成交集{ 2,3 }
{1,2} & {5,6} #set()
生成两个集合的对称补集:
A = {1,2,3}
B = {2,3,4}
A ^ B # {1,4} (去除AB的公共部分,即去除AB的交集后在进行并集)
A ^ B --> (A-B)|(B-A)
-->(A | B)-(A & B)
> 判断一个集合是另一个集合的超集
< 判断一个集合是另一个集合的子集
A = {1,2,3}
C = {2,3}
A > C #True
C < A #True
== / != 判断集合相同/不同
A = {1,2,3}
C = {2,3}
D = {2,1,3}
A == D #True
A == C #False
>= <= 判断超集和相同/子集和相同
实例:略
in / not 运算符
等同于字典中的in / not in ,判断某个值是否存在于集合中
not in 与 in 返回值相反
(3)
python3集合中常用的方法(以下方法用图像思维更好理解)
s代表集合对象
s.add(x) 在集合s中添加一个新元素,如果元素已经存在,则不添加@@@@@@@@@@@@@@@@@@@@@@@@@@@@
s.clear() 清空集合内所有元素
s.copy() 复制集合(浅拷贝)
s.difference(s2) 等同于 s - s2s2@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
s.difference_update(s2) 等同于s = s^s2(将s s2中相同的元素去掉后在合并)
s.discard(digit) 从集合s中移除一个数字,如果digit不是数字,则什么都不做
s.intersection(s2) 等同于s & s2
s.intersection_update(s2) 等同于s = s & s2
s.issubset(s2) 如果s为s2交集为非空返回True,否则返回False,等同于 s <= s2
s.pop() 从集合s中删除一个随机元素@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
s.remove(e) 从集合s中删除一个元素,如果元素不存在则会产生一个keyError错误@@@@@@@@@@@@@@@@@@
s.union(s2) 生成s与s2的全集等同于s | s2
s.update(s2) 等同于s = s | s2
(4)集合是可迭代对象(可以用for遍历拿出其中的元素进行数据输出,输出的顺序可能是无序的)
实例1:
s = {'abc',123,(1997,1,1)}
for x in s:
print(x)
>>>
123
abc
(1997, 1, 1)
s = {'abc',123,(1997,1,1)}
for x in range(3):
print(s[x]) ###错误,集合不支持索引,因为内部存储和输出是无序的
集合不存储重复的数据,数学意义的集合处理(与列表相比)
(6)字典也是可迭代对象
实例:
d = {"name":"tarena",(2002,1,1):"生日"}
for x in d:
print(x)
>>>
(2002, 1, 1)
name
这里有键,那自然就可以通过键来取值:d["name"] >>>"tarena"
(7)用于集合的函数
len(x)
max(x)
min(x)
sum(x)
any(x)
all(x)
(8)集合推导式:生成一系列有规律的集合数据
语法:
{表达式 for 变量 in 可迭代对象 (if 条件表达式)}
实例1:
用列表转化为集合!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
names = ["Tom","Jerry","Spike","Tom","Jerry","Tyke"]
animals_set = { n for n in names } #{'Tom', 'Jerry', 'Spike', 'Tyke'}
实例2:
l_set = { x for x in range(1,10)} #生成集合{1, 2, 3, 4, 5, 6, 7, 8, 9}
实例3:
l_set = { x:x for x in range(1,10)} #生成字典{1: 1, 2: 2, 3: 3, 4: 4, 5: 5, 6: 6, 7: 7, 8: 8, 9: 9}
(9)总结:
三中可变的数据类型(对象被创建之后可以进行变化):
list
dict
set
以上三种数据类型不能做字典的键,也不能做集合的值
(10)固定集合 frozenset
定义:创建一个不可变的,无序的,含有唯一元素是集合
创建空的固定集合:
frozenset()
创建非空的固定集合(创建后,不能删除和修改这个集合):
frozenset(iterable)
实例:
f = frozenset([1,3,5,7,9])
f = frozenset({1,3,5,7,9})
f = frozenset((1,3,5,7,9))
支持的运算(等同于set中的用法):
& 交集
| 并集
- 补集
^ 对称补集
in / not in
>>= <<= == !=
固定集合的方法:
相当于集合的全部方法去除修改集合的方法(比如没有add语句)
固定集合的作用:
作为字典的键,作为集合的值,
(11)阶段总结:
a.数据类型
bool in float complex str list tuple dict set frozenset
b.值
None False True ...
c.运算符
+ - * / // % **
>>= <<= == !=
is / is not
in / not in
not and or
+= -= ...
~ & | ^ <<>>
+(正号) -(负号)
=赋值(绑定)
d.表达式
1+2
input("aaaa")
a+b
a**2
e.语句
赋值语句 a = 10
if语句
while语句
for语句
break语句
continue语句
pass语句
else语句(if,whie,for的子句)
del语句
(12)输入重定向(追加至昨晚练习6的后面,可用来作为测试使用):
$ 命令 < 输入文件
作用:将文件的内容重定向为一个命令的输出
注:此时标准键盘输入可能无效
实例:
$:python3 yuan.py < shuju.txt
----------------------------------------------------------------------------------------------------------------------------------------
----------------------------------------------------------------------------------------------------------------------------------------
回顾练习:
1.s1 = "welcome to china",生成列表['welcome','to','china'],s2 = ['hello','tar','gz'],请生成字符串s为"hello.tar.gz"
解:
s1 = "welcome to china"
a = s1.split(' ')
l = list(a) # l = [a]
print(l)
s2 = ['hello','tar','gz']
b = '.'.join(s2)
print(b)
>>>
['welcome', 'to', 'china']
hello.tar.gz
总结:描述的是对字符串的分割和拼接操作,其中包含了字符串与列表的互相转换的方法。
字符串转列表,直接进行复制操作即可;列表元素合并转字符串通过拼接命令即可(拼接时可以不添加任何元素'',也可以添加空格)
2.创建一个元组T 为(20,30,40,50,40,30,20)请计算T中元素30的个数
解:
t = tuple(20,30,40,50,40,30,20)
a = t.count(30)
print(a)
bug:TypeError: tuple() takes at most 1 argument
分析:tuple() 中添加是是可迭代对象,而20,30,40,50,40,30,20是一串数字,不是想字符串一样的可迭代对象,需要转化为元组、列表等可迭代对象
改为:
t = tuple((20,30,40,50,40,30,20)) #t = tuple([20,30,40,50,40,30,20])
a = t.count(30)
print(a)
>>>2
3.创建一个字典d为{"name":"bob","age":30}#会用两种方法创建;请在字典d中创建新的键值对 "score":90,将字典d中的bob的age改为:25
如何查看字典d中键"age"的值
解:
d1 = {"name":"bob","age":30}
d2 = dict({"name":"bob","age":30}) #如果写为set则只取键
d1['score'] = 90
d1['age'] = 25
a = d1['age']
print(d1,'\n',d2,'\n',a)
>>>
{'age': 25, 'name': 'bob', 'score': 90}
{'name': 'bob', 'age': 30}
25
改进:
{'score': 90, 'age': 25, 'name': 'bob'}
{'name': 'bob', 'age': 30}
25
参考材料:
实例1-分割:
S = "welcome to tarena"
words = s.split(' ') #根据空格将原字符串拆成列表,也叫分割,生成['welcome','to','tarena']
实例2-拼接:
l = ["C:","windows","sys"]
'\\'.join(l)
创建一个非空的元组
t = (20,) >>>(20,) 含有一个元素的元组
t = 20, >>>(20,) 含有一个元素的元组
t = (1,2,3) >>>(1,2,3) 含有三个元素的元组
t = 1,2,3
t = 'hello',
t = ('1',2,'tree')
>>>L = [[10,20]1,2,3,4,5,3]
L.count(3) #对元素3进行计数统计
(1)创建空字典的方法:
d = {} #空字典
d = dict() #空字典
(2)创建非空字典的方法:
实例1:
d = {"name":"xiaoyu","age":22}
说明:"name":"xiaoyu"为一个键值对,各个键值对之间用逗号隔开,各个键值对内用冒号表示索引
字典取值:d['name'] >>>"xiaoyu"
实例2:
d = {"name":"xiaoyu","name":22} #这个不会报错,但是会留下唯一一个“键”(随机删除重复的键),留下后一个对应“22”的键
(5)添加/修改字典的元素: 字典[键]=值
实例:
d = {}
d['name'] = 'tarena' #创建新的键值对
d['age'] = 15 #创建新的键值对
d['age'] = 16 #修改age键对应的值
#插入键后,打印出的字典中键出现的顺序是随机的
字典取值:d['name'] >>>"xiaoyu"
----------------------------------------------------------------------------------------------------------------------------------------
课后练习:
1.
经理:曹操 刘备 周瑜
技术员:曹操,周瑜,张飞,赵云
用集合求:
1.既是经理也是技术员的人有谁?
2.是经理,但不是技术员的人都有谁?
3.是技术员,但不是经理的人都有谁?
4.张飞是经理吗?
5.身兼一职的人都有谁?
6.经理和技术员共有几人?
解:
a = {"曹操","刘备","周瑜"}
b = {"曹操","周瑜","张飞","赵云"}
c = a & b
print(c)
d = a - b
print(d)
e = b - a
print(e)
if {"张飞"} in a:
print("是")
else:
print("不是")
f = a | b - a & b ###这里的运算是从左到右依次进行的,需要加括号更改原来的运算顺序
修改为:f = (a | b) - (a & b) !!!!!!!!!!!!!!!!!!!!!!!!!!注意要加两个括号
改进为:f = a ^ b (将ab中都有的剔除掉,然后再进行合并)
len(a|b)
2.任意输入一些单词存入集合中,当输入0时结束输入。
打印输入的单词种类数(去重),每个单词打印一次到终端上
提示:可以用len()求集合的长度
a = input("please enter words:")
while a != 0:
s = { a }
s2.update(s)
a = input("please enter words:")
print(len(s))
print(s2)
3.模拟点名系统,已知全班名单,随机打印学生姓名进行点名,并得到此学生是否已到,输入'y'代表已到,输入'n'代表未到,点名完后,打印未到者名单
提示:集合/输入输出
第1中解法(未完成,有错误):
L = []
s = { 'aa','bb','cc','dd','ee' }
while True:
name1 = input("请输入被点名学生的姓名:")
if name1 == "ending":
break
come = input("学生是否到达(y/n):")
d ={ 'name':name1 , 'come': }
L.append(d)
for x in L:
if d[name] == 'n':
print(name)
第2中解法(参考助教):
stu_n = []
names = {'qq','ww','ee','rr','tt','yy'}
for x in names:
print('点名学生:',x,sep='')
choice = input("是否答到(y/n):")
if choice == 'n':
stu_n.append(x)
elif choice != 'y':
break
print("未到的学生:")
for i in stu_n:
print(i)
总结:
(1)遍历输出,实际是依次循环取出容器中的元素再进行输出,也就是循环查找依次,输出一个元素数据
for x in L #列表,字典,元组,集合#
print(x) #循环输出元素
4.假设一个列表有很多数据,以及重复的数据,例如:L = [9,8,4,6,8,9,4,1,...]
打印出列表中的数据,要求重复的只打印一次,打印的顺序以列表第一次出现顺序为准,如:上述列表打印:9,8,4,6,1...
提示:列表和集合组合使用,列表推导式
解:
L = [9,8,4,6,8,9,4,1,2,4]
s1 = set(L)
for x in L:
if x in s1:
print(x)
s1.remove(x)
print()
总结:先生成集合来去重,然后原序列按顺序依次和生成的集合进行比较,如果存在就输出,然后将集合中的元素删除。
- Python学习笔记(8)
- Python笔记(8)
- python笔记《8》
- python学习笔记8
- Python学习笔记8
- Python 学习笔记8
- python基础笔记-8
- Python学习笔记 8
- python笔记8
- python笔记8--python网络编程
- Python开发学习笔记(8) - Python 函数
- python 学习笔记8-----异常
- python学习笔记8--format
- python学习笔记(8)
- Python笔记8:模块操作
- python 8天入门笔记
- Python笔记
- python笔记
- 十进制转换(2、8、16)
- HDOJ3022 记忆化搜索
- HTML基础 网页结构基础6
- pmp引论-pmo -20171029
- Redis 主从复制
- python笔记8
- machine-learning-ex4
- Mysql源代码分析系列(1): 编译和调试--转载
- 关于U盘加密问题
- leetcode 9
- Linux 环境 C语言 操作MySql 的接口范例
- 排序算法
- 好胜心
- python笔记9