python的数据类型2,切片和集合的介绍,另外包含几个简便的消防法
一、切片
其实就是对 list/string 的一种取值方式,只取值,不改变原有的值,应用如下:
1 List = ['apple','banana','orange','blue','green','red','yellow']
2 print(List[:3]) #切片取值顾头不顾尾,取的下标值为0-2
3 #结果:['apple','banana','orange']
4
5 s = '123456789'
6 print(s[::-1]) #最后一位数代表部长,1时挨个取,2时隔1取1,-1时倒序取,但此时要写范围的话也应该是负数
7 #结果:987654321
先做个练习,之后引入一个比较重要的概念
1 li = [1,1,2,3,3,4,5,6,7,8,9]
2 for i in li:
3 if i%2!=0:
4 li.remove(i)
5 print(li)
这个练习,看上去像是通过循环把 list 中的奇数删除,但实际运行一下就知道,结果没有想象的那么简单)结果为:[1, 2, 4, 6, 8]
那为什么会这样子呢,这是因为,list 在循环的时候,实际循环的是它的下标,当某个元素被删除后,下标也就随之改变,这样一来,有的元素就判断不到了。所以应该找到一种方式,使循环的时候不要删除 list 的元素,这样下标不会错乱,每个元素就能被判断到了。
这里就可以用上切片取值,加 list2 = li[:]
1 li = [1,1,2,3,3,4,5,6,7,8,9]
2 list2 = li[:]
3 for i in li2:
4 if i%2 != 0:
5 li.remove(i)
6 print(li)
之所以不用 list2 = li 这种直接赋值的方式,这里又扯出俩概念,深拷贝和浅拷贝
深拷贝就是只把值赋值过来,但另外开辟一块内存空间,li 改变时 list2 不会改变
a. list2 = li[:]
b. list2 = copy.deepcopy(li)
浅拷贝是 ‘list2 = li’这种方式,这样的操作其实是两个 list 共享一块内存地址,li 变了的时候,list2 也会改变
二、集合
集合天生去重,是无序的,定义方式:
a = set() #空集合
b = {'a','b','c','d'} #非空集合
list 转成字符串的方式同样也适用于集合转成字符串,可以用在需要把集合内容写入文件时。
1. 集合的一些操作
1 s = set() #空集合
2 s.add(1) #添加元素
3 s.remove(1) #删除元素
2.交集、并集、差集、对称差集
交集:取两个集合共同部分 - a.intersection(b) 或者 a&b
并集:两个集合合并起来并去重 - a.union(b) 或者 a|b
差集:a.difference(b) 取集合 a 有,但是集合 b 没有的元素 - a.difference(b) 或者 a-b
对称差集:把两个集合都有的去除,保留两个集合中不一样的部分 - a.symmetric_difference(b) 或者 a^b
1 xn = ['xiaohei','xiaobai','xiaohuang','xiaolan']
2 zdh = ['xiaohei','xiaobai','xiaozi','xiaolv','xiaohong']
3
4 xn_set = set(xn)
5 zdh_set = set(zdh)
6
7 # print(xn_set.intersection(zdh_set)) #取交集
8 # print(xn_set & zdh_set )#取交集
9
10 # print(xn_set.union(zdh_set)) #并集 #把俩集合加一起,重复的去除
11 # print(xn_set |zdh_set )#并集
12
13 # print(xn_set.difference(zdh_set)) #差集,在a集合里面有,在b集合里面没有的
14 # print(xn_set - zdh_set) #差集
15
16 print(xn_set.symmetric_difference(zdh_set)) #对称差集,把两个集合里面都的去除
17 print(xn_set ^ zdh_set ) #对称差集
三、非空即真非0即真、列表生成式、三元表达式
1. 非空即真非0即真
可以用在条件判断,比如判断一个 list 是否为空,直接 ‘if list’ 就可以判断,取反的时候前面加 not,即 ‘if not list’
2. 列表生成式
1 #列表生成式
2 result = [ str(i).zfill(2) for i in range(1,20) if i<8 ]
3 print(result)
4
5 #普通的实现方式
6 result2 = []
7 for i in range(1,10):
8 if i<8:
9 j = str(i).zfill(2)
10 result2.append(j)
以上第一种的实现方式等同于第二种,且第一种的执行顺序也是第二种表现的那样。作用:使代码看起来更简洁。
3. 三元表达式
1 id_card = '410881199211111141'
2
3 # 第一种实现方式
4 # if int(id_card[-2]) % 2 == 0:
5 # sex = '女'
6 # else:
7 # sex = '男'
8 # print(sex)
9
10 # 第二种实现方式
11 sex = '女' if int(id_card[-2])%2 == 0 else '男' #三元表达式
12 print(sex)
满足条件则给变量赋前面的值,否则赋值 else 后面的。作用:使代码看起来更简洁。