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的值

posted @ 2020-03-17 23:27  斐波那切  阅读(209)  评论(0编辑  收藏  举报