• 【蓝桥杯冲击国赛计划第6天】字典


    在这里插入图片描述


    1. 字典

    1.1 概念

    列表是以连续的整数为索引,与此不同的是,字典以 key 为索引,key 可以是任意不可变类型,通常用字符串或数值。且 value 不仅仅可以是数字和字符串,也可以是一个列表,元组。其实和哈希表一样,都是以键值对(key : value)的形式来查找数据,但字典十分的灵活。

    ❗️每个 key 只能在字典中出现一次

    在这里插入图片描述


    1.2 字典的定义

    字典用一对花括号 {} 括起来,内部的值以 key : value 的形式呈现,key 可以是数字,字符串,甚至元组等数据结构。

    # 字典的定义
    empty_dict = {} # 创建空字典
    massege={'小李':'123124543643','xiaohua':'17855666'} # 使用字符串作为 key
    group_dict = {(60, 99):'good', 100:'nice'} # 使用元组作为 key
    
    • 1
    • 2
    • 3
    • 4

    1.3 字典的添加

    dict[key] = value 形式添加,key 分为两种情况。

    • 如果字典里没有该 key ,则创建一个新的 key : value 。
    • 如果字典里有该 key,原来的 value 值被覆盖。
    # 字典的添加
    dict2 = {}
    dict2["左轮"] = 20 # 字典没有值时,创建
    print(dict2)
    dict2["左轮"] = 18 # 字典有值时,修改
    print(dict2)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    在这里插入图片描述


    1.4 字典的修改

    修改有两种方式:

    • dict[key] = value,如果字典里有该 key,原来的 value 值被覆盖。
    • 或者使用 update 方法,update 方法里面放置的是一个字典,里面的 key 如果在原来字典里,则修改值。如果不在,则添加新的 key : value 。
    # 字典的修改
    dict2 = {'左轮': 18}
    dict2["左轮"] = 20 # 字典有值时,修改,但只能单次修改
    print(dict2)
    dict2.update({'左轮':16,"右轮":16}) # update,修改和创建都可以
    print(dict2)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    在这里插入图片描述


    1.5 字典的删除

    del dict[key] 可以删除指定字典的键,如果使用字典的内置方法 clear 会清空整个字典,使其变成空字典。如果直接 del dict,那么这个字典就真的不存在了,相当于彻底删除

    # 字典的删除
    dict2 = {'左轮': 18,'右轮': 20}
    del dict2['右轮']  # 删除指定键
    print(dict2)
    dict2.clear() # 清空字典,但字典还在,变成空字典
    print(dict2)
    dict2 = {'左轮': 18,'右轮': 20}
    del dict2 # 删除字典,真正删除了
    print(dict2)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    在这里插入图片描述


    1.6 字典的访问

    dict[key] 可以直接访问 key 的值,但如果不存在该 key ,就会报错。所以,这里多了 get 方法,语法是:dict.get(key),如果 key 存在,也可以直接访问 key 的值,如果 key 不存在,那么返回 None。

    # 字典的访问
    dict = {'Name': 'zuolun', 'Age': '1024'}
    print(dict['Name']) # 访问指定值,如果key值不存在,将会抛出异常
    
    # get()方法,不存在会返回None,但不会抛出异常
    print(dict.get('lorem'))
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    在这里插入图片描述


    1.7 字典的排序

    字典排序:统一写在排序里,还在整理


    2. 实例「弗里的语言」

    我们之前通过哈希表完成了这个实例,现在我们通过字典就更加简单。

    题目描述

    小发明家弗里想创造一种新的语言,众所周知,发明一门语言是非常困难的,首先你就要克服一个困难就是,有大量的单词需要处理,现在弗里求助你帮他写一款程序,判断是否出现重复的两个单词。

    输入描述

    第 1 行,输入 N,代表共计创造了多少个单词。

    第 2 行至第 N+1 行,输入 N 个单词。

    1≤ N ≤10^4,保证字符串的总输入量不超过 10^6。

    输出描述

    输出仅一行。若有重复的单词,就输出重复单词,没有重复单词,就输出 NO,多个重复单词输出最先出现的。

    输入输出样例

    示例1

    输入

    6
    1fagas 
    dsafa32j
    lkiuopybncv
    hfgdjytr
    cncxfg
    sdhrest
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    输出

    NO
    
    • 1
    示例2

    输入

    5
    sdfggfds
    fgsdhsdf
    dsfhsdhr
    sdfhdfh
    sdfggfds
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    输出

    sdfggfds
    
    • 1

    运行限制

    • 最大运行时间:3s
    • 最大运行内存: 512M

    2.1 简单分析

    如果用字典的话,寻找重复可以理解为字典里面是否存在相同的 key。所以我可以进行对字典的访问,但直接用 dict[key] 访问可能会报错,因为一开始没有添加 key。
    我们一定是先判断是否有 key,再添加 key。如果先添加的话,存在重复值时,key 中的值会被覆盖,我们无法区别出这个 key 是现在添加的,还是我修改覆盖的。所以,一定是先判断是否有 key,再添加 key。如果有,那么说明重复,没有就说明未添加,添加进去即可。


    2.2 初始化

    设置空字典和查找标记(查不到为 0,查到为 1)

    n = int(input())
    d = {}
    flag = 0 # 尚未找到
    
    • 1
    • 2
    • 3

    2.3 get 访问

    如果访问不到新输入的键,说明字典中没有,所以添加该键到字典中(这里键所对应的值可以任意,我就将值设为 0 了。)

    如果访问到新输入的键,证明重复,那么查找比较置1,且直接输出该键,退出循环。

    for i in range(n):
        x = input()
        if d.get(x) == None: # 没有这个键
            d[x] = 0 # 添加,value任意即可
    
        else: # 有这个键
            print(x)
            flag = 1 # 找到了
            break
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    2.4 补充

    如果查找标记一直是 0,说明该字典中不存在重复(也就是 get 一直访问不到),所以退出循环的时候,要判断 flag,如果为 0,说明要输出 “NO”。

    if not flag: # 没找到
        print("NO")
    
    • 1
    • 2

    2.5 完整代码

    可在 我的仓库免费查看,文件名:10-字典-弗里的语言,如果无法使用可以及时私信我或在评论区指出,谢谢。


    3. 实例「快递分拣」

    题目描述

    蓝桥王国的每个快递都包含两个参数:1.快递单号 2.快递城市。

    小李是蓝桥王国的一名快递员,每天的快递分拣让他苦不堪言。

    于是他想要你帮他设计一个程序用于快递的分拣(将不同快递按城市信息分开)。

    输入描述

    输入第一行包含一个整数 N,表示快递的个数。

    接下来第 2∼N+1 行每行包含一个字符串 S 和一个字符串 P,分别快递单号以及快递对应的城市。

    1≤N≤10^3,保证数据量不超过 10^6。

    输出描述

    输出共若干行。按城市的输入顺序依次输出城市的名称以及城市的快递个数,以及该城市的所有快递单号(单号按照输入顺序排序)。

    输入输出样例

    示例

    输入

    10 
    10124214 北京
    12421565  上海
    sdafasdg213 天津
    fasdfga124 北京
    145252  上海
    235wtdfsg 济南
    3242356fgdfsg 成都
    23423 武汉  
    23423565f 沈阳
    1245dfwfs 成都
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    输出

    北京 2
    10124214
    fasdfga124
    上海 2
    12421565
    145252
    天津 1
    sdafasdg213
    济南 1
    235wtdfsg
    成都 2
    3242356fgdfsg 
    1245dfwfs 
    武汉 1
    23423
    沈阳 1
    23423565f 
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    运行限制

    • 最大运行时间:1s

    • 最大运行内存: 256M


    3.1 简单分析

    这里比刚才的题难了一点点,首先是我们要确定键应该是城市的名称,然后快递单号是值。这里我们发现:一个键可能存在多个值,这时候我们会选择用列表来存储多个值。


    3.2 初始化

    一如既往的设置

    n = int(input())
    d = {} # 空字典
    
    • 1
    • 2

    3.3 get 访问

    首先我们要对我们输入的字符串进行分割,则 op[0] 是快递单号,op[1] 是城市,所以我们进行 get 访问的时候,访问的是 op[1],如果没访问到,说明字典里没有,需要添加,我们刚才说过,多个值可以用列表来存储,所以就 d[op[1]] = [op[0]]。如果 get 访问到,那么就需要添加,d[op[1]] 得到这个列表,尾插新的值即可。

    for i in range(n):
        op = input().split()
        if d.get(op[1]) == None: # 字典没有需添加
            d[op[1]] = [op[0]] # 用列表做值,可以多次存储
    
        else: # 字典已有该值
            d[op[1]].append(op[0])
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    3.4 遍历再遍历

    字典是一个可迭代对象,但单纯迭代的时候,它迭代的是字典的键。

    如果我们要遍历字典的值,由于值也是一个列表,所以理应再用循环遍历。

    for key in d: # 遍历字典,这类遍历的是键
        print(key,end=" ")
        x = len(d[key]) # 列表长度(该键有多少值)
        print(x)
        for i in range(x):
            print(d[key][i]) # 遍历输出每一个值
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    3.5 完整代码

    可在 我的仓库免费查看,文件名:11-字典-快递分拣,如果无法使用可以及时私信我或在评论区指出,谢谢。


    本文主要参考蓝桥杯省赛14天夺奖冲刺营,有兴趣的可以自己在蓝桥杯官网搜索

    如有错误,敬请指正,欢迎交流🤝,谢谢♪(・ω・)ノ

  • 相关阅读:
    人工神经网络的基本模型,神经网络解剖学模型图
    龙蜥白皮书精选:机密计算平台技术
    代码随想录算法训练营第六十二天 | 84.柱状图中最大的矩形
    目标检测1——YOLO数据标注以及xml转为txt文件脚本实战
    课件演示用什么软件?万兴录演:多种录屏方式任你选
    数据分析 | Pandas 200道练习题,每日10道题,学完必成大神(8)
    【车载开发系列】汽车嵌入式开发常用工具介绍
    深度学习(二)BERT模型及其一系列衍生模型
    pytorch 龙良曲 自用笔记
    【优化算法】凌日搜索算法【含Matlab源码 2150期】
  • 原文地址:https://blog.csdn.net/m0_51302822/article/details/127901931