05 常用技巧介绍(列表、元组、字典)
2019-10-28 本文已影响0人
武漂的小丙
1 列表操作
li = ['alex', 'wusir', 'egon', '女神', 'taibai']
# 在最后的位置增加
li.append('当当')
print(li)
# 迭代加到最后的位置
li.extend('昊天')
print(li)
# 在‘女神’后面加一个123
li.insert(4,123)
print(li)
# 按索引删除,默认删除最后一个
li.pop()
print(li)
li.pop(1)
print(li)
# 按元素删除,有重复元素,删除索引最小的一个
li.append('当当')
print(li)
li.remove('当当')
print(li)
# 清空列表
li.clear()
print(li)
'''输出结果如下:
['alex', 'wusir', 'egon', '女神', 'taibai', '当当']
['alex', 'wusir', 'egon', '女神', 'taibai', '当当', '昊', '天']
['alex', 'wusir', 'egon', '女神', 123, 'taibai', '当当', '昊', '天']
['alex', 'wusir', 'egon', '女神', 123, 'taibai', '当当', '昊']
['alex', 'wusir', '女神', 123, 'taibai', '当当', '昊']
['alex', 'wusir', '女神', 123, 'taibai', '当当', '昊', '当当']
['alex', 'wusir', '女神', 123, 'taibai', '昊', '当当']
[]
'''
删除列表
li = ['alex', 'wusir', 'egon', '女神', 'taibai', '当当']
# 从0开始删除前两个:
del li[0:2]
print(li)
'''输出结果如下:
['egon', '女神', 'taibai', '当当']
'''
赋值
li = ['alex', 'wusir', 'egon', '女神', 'taibai', '当当']
li[0] = '男神'
print(li)
li[0] = [1,2,3]
print(li)
# 将从0开始的前两个拿出来,然后迭代添加进去
li[0:2] = '阿里巴巴'
print(li)
li[0,4] = [123,'春哥', 'dddd']
print(li)
'''输出结果如下:
['男神', 'wusir', 'egon', '女神', 'taibai', '当当']
[[1, 2, 3], 'wusir', 'egon', '女神', 'taibai', '当当']
['阿', '里', '巴', '巴', 'egon', '女神', 'taibai', '当当']
[123, '春哥', 'dddd', 'egon', '女神', 'taibai', '当当']
'''
查询
for i in li:
print(i)
print(li[0:2])
公共方法:
- len:测量长度
len(li)
- count:统计出现的次数
li = ['阿', '里', '巴', '巴', 'egon', '女神', 'taibai', '巴巴']
li.count('巴')
- index:返回索引
li = ['阿', '里', '巴', '巴', 'egon', '女神', 'taibai', '巴巴']
# 返回第一次出现的索引
li.index('巴')
- sort:排序
# 正向排序
li.sort()
# 反向排序
li.sort(reverse=True)
- reverse:反转
li = [123, '春哥', 'dddd', 'egon', '女神', 'taibai', '当当']
li.reverse()
# reverse反转的是自身
print(li)
'''输出结果如下:
['当当', 'taibai', '女神', 'egon', 'dddd', '春哥', 123]
'''
列表嵌套:
li = ['taibai', '武藤兰', '苑昊', ['alex','egon',89],23]
# 打印一个“藤”
print(li[1][1])
# 将‘taibai’改为‘Taibai’,即首字母大写
name = li[0].capitalize()
li[0] = name
print(li)
2 元组操作
- 元组:
- 只读列表
- 可循环查询,可切片
- 儿子不能改,孙子可能可以改
tu = (1, 2, 3, 'alex', [2, 3, 4, 'taibai'], 'egon')
# 找到alex
print(tu[3])
# 分片
print(tu[0:4])
# 循环
for i in tu:
print(i)
# 将taibai 改成 TAIBAI
tu[4][3] = tu[4][3].upper()
print(tu)
# 添加一个元素‘sb’
tu[4].append('sb')
print(tu)
# str ---》 list 用 split
# list ---》 str 用 jion
# list的元素都必须是字符串
s = 'alex'
s1 = '__'.join(s)
tu = ( 'alex', 'egon')
s2 = '__'.join(tu)
print(s1)
print(s2)
3 字典
python唯一映射数据类型
-
数据类型:
- 可变数据类型(不可hash):list,dict,set
- 不可变数据类型(可hash):元组,bool, int,str
-
dict:
- key:必须是不可变数据类型,可hash
- value:任意数据类型
- 优点:
- 二分查找去查询
- 存储大量的关系型数据
- 特点:
- 无序的
dic1 = {
'name': ['大猛', '小孟'],
'py9': [{'num':71, 'avg_age':18}],
True:1,
(1,2,3): 'wuyiyi',
# 元组里面带有list也是不行的
# (12,[1,2]): '行不行',
2: '儿歌'
}
print(dic1)
# 删
print(dic1.pop('py9')) # 有则按键删除, 返回此键的value
print(dic1.pop('py9',"没有此建")) # 没有此建,可以设置返回值
print(dic1.popitem()) # 随机删除,有返回值 元组(里面是删除的键值)
print(dic1)
# 查
print(dic1.keys())
print(dic1.values())
print(dic1.items())
遍历的技巧:
a = 1
b = 2
# a,b 地址互换
a,b = b,a
print (a, b)
a, b = [1, 2]
print (a, b)
a, b = [1, 2], [2, 3]
print (a, b)
a, b = (1, 2)
print (a, b)
for k,v in dic1.items():
print (k, v)
键值不报错的方式:
v1 = dic1['name']
v2 = dic1['name1'] # 报错
print(dic1.get('name1', '没有这个键'))
输入一段字符串,只将字母转成“空格”
info = input(">>>") #fhdalf1232ddfqer12dfjal13
for i in info:
if i.isalpha():
info = info.replace(i," ")
l = info.split()
print(len(l))
ps:“for i in info:”在这一句的时候info已经载入for循环中了,因此循环在里面修改info的时候,也不会更改for循环的执行情况
4 作业
循环打印列表:“(1, 2, 3, 'alex', [2, 3, 4, 'taibai'], 'egon')” , 要求子列表的元素也能循环打印,即如下所示:
1,
2,
3,
'alex',
2,
3,
4,
'taibai',
'egon'
解答如下:
# 采用递归的方式迭代打印元素
def iteratorPrint(it):
for item in it:
if isinstance(item, Iterable) and not isinstance(item, str):
iteratorPrint(item)
else:
print(item)
iteratorPrint(tu)
5 小结
5.1 = 、==、 is
- =:赋值
-
==:比较值是否相等
-
is:比较的是内存地址
5.2 内存地址
- id:看内容
-
数字,字符串:小数据池
-
数字的范围:-5 ~256
image-20191027191722923.png
-
-
字符串的范围:
- 不能有特殊字符
- 剩下的list、tuple、dict、set都不没有小数据池的概念
5.3 编码说明
-
编码:
- ascii:
- 只能有英文
- 一个字节表示(8位)
- unicode:
- A:32位 四个字节
- 中:32位 四个字节
- utf-8:
- A: 8位 一个字节
- 中: 24位 三个字节
- gbk:
- A: 8位 一个字节
- 中:16位 两个字节
- 注意事项:
- 各个编码之间的二进制,是不能互相识别的,会产生乱码;
- 文件的存储,传输,不能是unicode(只能是utf-8 、 utf-16、gbk、ascii等),只是用于转换
- ascii:
-
python3
- str 在内存中用的是unicode存储的,
- bytes类型
- str 在内存中用的是unicode存储的,
-
对于英文
- str:
- 表现形式: s = 'alex'
- 编码方式 010101010 unicode
- bytes
- 表现形式: s1 = b'alex'
- 编码方式: 000101010 utf-8 gbk 。。。
- str:
-
对于中文:
- str:
- 表现形式:s = '中国'
- 编码方式:0101010 unicode
- bytes:
- 表现形式: s = b'x\e91\e91\e01\e21\e32'
- 编码方式:000101010 ut-8 gbk 。。。
- str:
-
encode编码, 如何将str --> bytes,而且可以设置编码方式
s1 = 'alex'
s11 = s1.encode('utf-8')
print(s11)
s2 = '中国'
# utf-8 是三个字节表示一个汉字
s21 = s2.encode('utf-8')
print(s21)
# gbk 是两个字节表示一个汉字
s22 = s2.encode('gbk')
print(s22)