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()

 

总结:先生成集合来去重,然后原序列按顺序依次和生成的集合进行比较,如果存在就输出,然后将集合中的元素删除。

 

原创粉丝点击