Python学习-字典入门、列表练习
接下来记录一下字典和列表练习相关的内容。
数据类型
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