接下来记录一下字典和列表练习相关的内容。
数据类型
python中有可变和不可变数据类型,如下
(1)可变类型:list、dict、set(集合,后面补充)
(2)不可变类型:int、bool、str、tuple
字典
基本概念
字典(dict),是可变数据类型,跟前面学的列表一样,也是容器型数据类型。使用时以{}包起来,是以键值对形式保存的数据类型,类似java中的map映射,但是还是有很大区别的。比如java中map的键可以是自定义对象,重写equals和hashCode方法即可,而python的键必须是不可变数据类型。
键:必须是不可变数据类型,如int和str,另外bool和tuple几乎不用。
值:可以是任意数据类型,还可以是对象。
字典在python3.5之前是无序的,即key为A的先插入字典,key为B的后插入,打印结果可能key为B的数据在前面。python3.6x会按照初次建立字典的顺序排列,但学术上认为依然不是有序的,直到从python3.7开始,才是有序的,本机版本是python3.7。
m={\'messi\':
{"name":"messi","age":35,"score":50},
\'python\':
{"基础","面向对象","网络","自动化运维"},
\'alpha\':
{\'c\',\'b\',\'a\'}
}
print(m)
控制台打印,字典key顺序没有变化,value的顺序每次运行结果不一定相同。
{\'messi\': {\'name\': \'messi\', \'age\': 35, \'score\': 50}, \'python\': {\'网络\', \'面向对象\', \'自动化运维\', \'基础\'}, \'alpha\': {\'a\', \'b\', \'c\'}}
字典保存的数据具备一定的关联性,查询数据非常快,是空间换时间的代表。
创建字典
创建字典常见有三种方式。
# 方式1 传入元祖,元祖里面元素就是元祖
dic = dict(((\'messi\', 1), (\'ronald\', 2), (\'herry\', 3), (\'kaka\', 4)))
print(dic) # {\'messi\': 1, \'ronald\': 2, \'herry\': 3, \'kaka\': 4}
# 方式2 通过key-value对
dic2 = dict(messi=1, ronald=2, herry=3, kaka=4)
print(dic2)
# 方式3 直接传入
dic3 = dict({\'messi\': 1, \'ronald\': 2, \'herry\': 3, \'kaka\': 4})
print(dic3)
# 验证字典的合法性
# 让key为list
# dic={[1,2,3]:"messi"} # 运行报错提示 TypeError: unhashable type: \'list\'
控制台
# 三种创建方式打印结果一样
{\'messi\': 1, \'ronald\': 2, \'herry\': 3, \'kaka\': 4}
{\'messi\': 1, \'ronald\': 2, \'herry\': 3, \'kaka\': 4}
{\'messi\': 1, \'ronald\': 2, \'herry\': 3, \'kaka\': 4}
增
可以使用下标直接增加,也可以使用setdefault方法。
# 1 增
dic = {1: \'messi\', 2: \'ronald\', 3: \'herry\'} # 键必须唯一,不可变
print(dic)
# 增加
dic[4] = \'kaka\'
print(dic)
# 再赋值,就变成了修改,所以是有则改,无则增
dic[4] = \'zidane\'
print(dic)
# setdefault方法,有key-value则不变,无则增加,没给定value就是None
dic.setdefault(5)
print(dic)
dic.setdefault(6, \'becham\')
print(dic)
控制台
{1: \'messi\', 2: \'ronald\', 3: \'herry\'}
# 增加了kaka
{1: \'messi\', 2: \'ronald\', 3: \'herry\', 4: \'kaka\'}
# 有则改,无则增
{1: \'messi\', 2: \'ronald\', 3: \'herry\', 4: \'zidane\'}
# setdefault方法,有key-value则不变,无则增加,没给定value就是None
{1: \'messi\', 2: \'ronald\', 3: \'herry\', 4: \'zidane\', 5: None}
# 给定value
{1: \'messi\', 2: \'ronald\', 3: \'herry\', 4: \'zidane\', 5: None, 6: \'becham\'}
删
可以使用pop、clear和del来删除。
dic={1: \'messi\', 2: \'ronald\', 3: \'herry\', 4: \'zidane\', 5: None, 6: \'becham\'}
# 按照key来删除
r = dic.pop(1) # 将被删除的值返回
print(r)
print(dic)
# 如果不确定是否有key,为防止没有key删除报错,可以给定第二个参数
r = dic.pop(8, "没有这个值")
print(r)
print(dic)
# clear 清空内容
# dic.clear()
# print(dic)
# del 如果没有这个key,del会报错
del dic[2]
print(dic)
控制台
messi
{2: \'ronald\', 3: \'herry\', 4: \'zidane\', 5: None, 6: \'becham\'}
# 没有key=8的值,打印第二个参数
没有这个值
{2: \'ronald\', 3: \'herry\', 4: \'zidane\', 5: None, 6: \'becham\'}
# del删除了key=2的数据
{3: \'herry\', 4: \'zidane\', 5: None, 6: \'becham\'}
改
改类似于增的操作,有key对应的数据就是改。
dic[5] = \'Ronaldinho\'
print(dic)
控制台
# key=5的value修改成了小罗
{3: \'herry\', 4: \'zidane\', 5: \'Ronaldinho\', 6: \'becham\'}
查
直接通过dic[key]来查找会因为key不存在,容易报错,一般使用get方法。
dic={3: \'herry\', 4: \'zidane\', 5: \'Ronaldinho\', 6: \'becham\'}
# 普通的根据key来查,这种方法如果key不存在容易报错
print(dic[3])
# print(dic[7]) # KeyError: 7
# 可以使用get来查,不容易报错
print(dic.get(3))
print(dic.get(7)) # None
print(dic.get(7, "没有这个key,你个饿货"))
控制台
# 通过dic[key]来查找
herry
# get方法
herry
# 没有这个key也不会报错,返回None
None
# 没有这个key也不会报错,返回自定义返回值
没有这个key,你个饿货
keys、values、items
字典里有keys、values和items的方法,scala中的映射map,也有keys和values方法。
dic={3: \'herry\', 4: \'zidane\', 5: \'Ronaldinho\', 6: \'becham\'}
print(dic.keys(), type(dic.keys())) # dict_keys([3, 4, 5, 6]) <class \'dict_keys\'>
print(dic.values(),type(dic.values())) # dict_values([\'herry\', \'zidane\', \'Ronaldinho\', \'becham\']) <class \'dict_values\'>
# 可以循环遍历key
for key in dic.keys():
print(key)
# 可以转换为列表
r = dic.keys()
print(list(r))
# key-value对
for i in dic.items():
print(i)
# 上面的i,其实就是一个元祖,可以拆包
for k, v in dic.items():
print(k, v)
控制台
dict_keys([3, 4, 5, 6]) <class \'dict_keys\'>
dict_values([\'herry\', \'zidane\', \'Ronaldinho\', \'becham\']) <class \'dict_values\'>
# 可以循环遍历key
3
4
5
6
# 可以转换为列表
[3, 4, 5, 6]
# key-value对
(3, \'herry\')
(4, \'zidane\')
(5, \'Ronaldinho\')
(6, \'becham\')
# 元祖,可以拆包
3 herry
4 zidane
5 Ronaldinho
6 becham
经典面试题
替换a、b两个值在python中也有多种方法,以下替换是python独有的,其他使用中间值替换、求和替换和异或运算替换在java中也有。
# 面试题 替换下面两个数
a = 18
b = 12
a, b = b, a # a,b=12,18 变量的重新赋值
print(a, b)
练习
字典+列表练习。
dic = {\'k1\': \'v1\', \'k2\': \'v2\', \'k3\': [11, 22, 33]}
# 请在字典中添加一个键值对\'k4\':\'v4\',输出添加后的字典
dic[\'k4\'] = \'v4\'
print(dic)
# 修改字典中k1对应的值为\'alex\',输出修改后的字典
dic[\'k1\'] = \'alex\'
print(dic)
# 在k3对应的值中追加一个元素44,输出修改后的字典
# dic[\'k3\'].append(44)
dic.get(\'k3\').append(44)
print(dic)
# 在k3对应的值的第一个位置插入元素18,输出修改后的字典
dic[\'k3\'].insert(0, 18)
print(dic)
控制台
# 请在字典中添加一个键值对\'k4\':\'v4\',输出添加后的字典
{\'k1\': \'v1\', \'k2\': \'v2\', \'k3\': [11, 22, 33], \'k4\': \'v4\'}
# 修改字典中k1对应的值为\'alex\',输出修改后的字典
{\'k1\': \'alex\', \'k2\': \'v2\', \'k3\': [11, 22, 33], \'k4\': \'v4\'}
# 在k3对应的值中追加一个元素44,输出修改后的字典
{\'k1\': \'alex\', \'k2\': \'v2\', \'k3\': [11, 22, 33, 44], \'k4\': \'v4\'}
# 在k3对应的值的第一个位置插入元素18,输出修改后的字典
{\'k1\': \'alex\', \'k2\': \'v2\', \'k3\': [18, 11, 22, 33, 44], \'k4\': \'v4\'}
列表练习
敏感词过滤
开发敏感词过滤,用户的评论,如果包含特殊字符,则过滤,并替换成同样长度的*后,到列表中,如果没敏感词,则直接添加到列表中。
# 敏感词列表 li = [\'苍老师\', \'台湾热\', \'吴腾蓝\', \'搏斗也接移\']
li = [\'苍老师\', \'台湾热\', \'吴腾蓝\', \'搏斗也接移\']
# 过滤后评论列表
return_li=[]
while True:
line=input("请输入评论")
# 按q或Q后退出
if line.upper()==\'Q\':
break
# 开始过滤
for i in li:
# 查看评论是否有敏感字
if i in line:
# 有敏感字,就替换,长度一致的*
line=line.replace(i,len(i)*\'*\')
return_li.append(line)
# 打印结果
print(return_li)
控制台测试结果
打印复杂列表
有如下列表,它里面还嵌套了一个列表,实现循环打印列表中的每个元素,如果遇到列表,再打印里面的子元素。
li = [1, 3, 4, \'alex\', [3, 7, 8, \'taiwan\'], 5, \'RiTiAn\']
# print(li,type(li)) # <class \'list\'>
for item in li:
# 判断是否是列表
if type(item)==type(li):
for item2 in item:
print(item2)
else:
print(item)
控制台
1
3
4
alex
3
7
8
taiwan
5
RiTiAn
字符串格式确认
查找列表中的元素,移除每个元素的空格,然后找出以A或者a开头,并且以c结尾的所有元素,添加到一个新的列表中,最后循环打印这个新的列表。
li=[\'TaiBai\',\'alexC\',\'AbC\',\'egon\',\'riTiAn\',\'Wusir\',\'aqc\']
# 新的列表
newli=[]
for i in li:
# 去除前后空格
i=i.strip()
# 以下三种方法都可以实现判断
# if (i.startswith(\'a\') or i.startswith(\'A\')) and i.endswith(\'c\'):
# if i.upper().startswith(\'A\') and i.endswith(\'c\'):
if i[0].upper()==\'A\' and i[-1]==\'c\':
newli.append(i)
# 最后循环打印
for i in newli:
print(i)
控制台
aqc
int类型转换
这一块跟列表没关系,先加这里。int对数字型字符串进行类型转换,如果有空格,可以不用去空格,类型转换时会自动去掉空格。
print(int(\' 9 \')) # 9
以上,比较啰嗦,后面查看用。
参考博文:
(1)https://blog.csdn.net/zhoulei124/article/details/96132625