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就是Nonedic.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))  # Noneprint(dic.get(7, "没有这个key,你个饿货"))

控制台

# 通过dic[key]来查找herry# get方法herry# 没有这个key也不会报错,返回NoneNone# 没有这个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'># 可以循环遍历keyfor 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'># 可以循环遍历key3456# 可以转换为列表[3, 4, 5, 6]# key-value对(3, 'herry')(4, 'zidane')(5, 'Ronaldinho')(6, 'becham')# 元祖,可以拆包3 herry4 zidane5 Ronaldinho6 becham

经典面试题

替换a、b两个值在python中也有多种方法,以下替换是python独有的,其他使用中间值替换、求和替换和异或运算替换在java中也有。

# 面试题 替换下面两个数a = 18b = 12a, 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)

控制台

134alex378taiwan5RiTiAn

字符串格式确认

查找列表中的元素,移除每个元素的空格,然后找出以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

(2)https://blog.csdn.net/xiaolangmin/article/details/88365769?depth_1-utm_source=distribute.pc_relevant.none-task&utm_source=distribute.pc_relevant.none-task 交换a b的值

Python学习-字典入门、列表练习

评论关闭