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

Posted 斐波那切

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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

(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学习-字典入门列表练习的主要内容,如果未能解决你的问题,请参考以下文章

Python 基础 2022 最新第三课 列表 & 字典

Python 基础 2022 最新第三课 列表 & 字典

Python3学习笔记-字典及列表练习

Python从入门到精通(加项目实战)学习视频

Python编程入门到实践 - 笔记( 6 章)

Python3.5入门学习记录-列表元在字典