【蓝桥杯冲击国赛计划第6天】字典 {题目:弗里的语言、快递分拣}_快递分拣蓝桥杯python-程序员宅基地

技术标签: 算法  python  散列表  蓝桥杯  冲击蓝桥杯国赛系列  数据结构  

在这里插入图片描述


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.3 字典的添加

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

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

在这里插入图片描述


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.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.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.7 字典的排序

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


2. 实例「弗里的语言」

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

题目描述

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

输入描述

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

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

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

输出描述

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

输入输出样例

示例1

输入

6
1fagas 
dsafa32j
lkiuopybncv
hfgdjytr
cncxfg
sdhrest

输出

NO
示例2

输入

5
sdfggfds
fgsdhsdf
dsfhsdhr
sdfhdfh
sdfggfds

输出

sdfggfds

运行限制

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

2.1 简单分析

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


2.2 初始化

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

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

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

2.4 补充

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

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

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 成都

输出

北京 2
10124214
fasdfga124
上海 2
12421565
145252
天津 1
sdafasdg213
济南 1
235wtdfsg
成都 2
3242356fgdfsg 
1245dfwfs 
武汉 1
23423
沈阳 1
23423565f 

运行限制

  • 最大运行时间:1s

  • 最大运行内存: 256M


3.1 简单分析

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


3.2 初始化

一如既往的设置

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

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])

3.4 遍历再遍历

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

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

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

3.5 完整代码

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


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

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

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/m0_51302822/article/details/127901931

智能推荐

http隧道 java_使用java语言实现http隧道技术-程序员宅基地

文章浏览阅读119次。该楼层疑似违规已被系统折叠隐藏此楼查看此楼/***Getaparametervalue**@paramkeyString*@paramdefString*@returnString*/publicStringgetParameter(Stringkey,Stringdef){returnisStandalone?System.getProperty(ke..._java http隧道

Keepalived高可用+邮件告警_keepalived sendmail-程序员宅基地

文章浏览阅读913次。IP主机名备注192.168.117.14keepalived-master主节点192.168.117.15keepalived-slaver备节点192.168.117.100VIP1.主备节点均安装keepalived# yum install -y keepalived httpd2.主备节点均修改keepalived日志存放路径..._keepalived sendmail

SPFILE 错误导致数据库无法启动(ORA-01565)_ora01565 ora27046-程序员宅基地

文章浏览阅读469次。--==========================================--SPFILE错误导致数据库无法启动(ORA-01565)--========================================== SPFILE错误导致数据库无法启动 SQL> startup ORA-01078: failurein proce_ora01565 ora27046

功能测试基础知识(1)-程序员宅基地

文章浏览阅读6.1k次,点赞2次,收藏54次。功能测试基础知识总结_功能测试

postgresql 中文排序_pg中文排序-程序员宅基地

文章浏览阅读3.2k次,点赞3次,收藏2次。pg 中文首字母排序_pg中文排序

[Mysql] CONVERT函数_mysql convert-程序员宅基地

文章浏览阅读3.1w次,点赞23次,收藏109次。本文主要讲解CONVERT函数_mysql convert

随便推点

HTML5与微信开发(2)-视频播放事件及API属性_微信开发者工具视频快进-程序员宅基地

文章浏览阅读8.6k次,点赞2次,收藏2次。HTML5 的视频播放事件想必大家已经期待很久了吧,在HTML4.1、4.0之前我们如果在网页上播放视频无外乎两种方法: 第一种:安装FLASH插件或者微软发布的插件 第二种:在本地安装播放器,在线播放组件之类的 因为并不是所有的浏览器都安装了FLASH插件,就算安装也不一定所有的都能安装成功。像苹果系统就是默认禁用FLASH的,安卓虽然一开始的时候支持FLASH,但是在安卓4.0以后也开始不_微信开发者工具视频快进

JedisConnectionException Connection Reset_jedisconnectionexception: java.net.socketexception-程序员宅基地

文章浏览阅读5.4k次,点赞3次,收藏4次。在使用redis的过程常见错误总结1.JedisConnectionException Connection Reset参考这边文章:Connection reset原因分析和解决方案https://blog.csdn.net/cwclw/article/details/527971311.1问题描述Exception in thread "main" redis.clients...._jedisconnectionexception: java.net.socketexception: connection reset

Lua5.3版GC机制理解_lua5.3 gc-程序员宅基地

文章浏览阅读8.3k次,点赞8次,收藏42次。目录1.Lua垃圾回收算法原理简述2.Lua垃圾回收中的三种颜色3.Lua垃圾回收详细过程4.步骤源码详解4.1新建对象阶段4.2触发条件4.3 GC函数状态机4.4标记阶段4.5清除阶段5.总结参考资料lua垃圾回收(Garbage Collect)是lua中一个比较重要的部分。由于lua源码版本变迁,目前大多数有关这个方面的文章都还是基于lua5.1版本,有一定的滞后性。因此本文通过参考当前..._lua5.3 gc

手机能打开的表白代码_能远程打开,各种手机电脑进行监控操作,最新黑科技...-程序员宅基地

文章浏览阅读511次。最近家中的潮人,老妈闲着没事干,开始学玩电脑,引起他的各种好奇心。如看看新闻,上上微信或做做其他的事情。但意料之中的是电脑上会莫名出现各种问题?不翼而飞的图标?照片又不见了?文件被删了,卡机或者黑屏,无声音了,等等问题。常常让她束手无策,求助于我,可惜在电话中说不清,往往只能苦等我回家后才能解决,那种开心乐趣一下子消失了。想想,这样也不是办法啊, 于是,我潜心寻找了两款优秀的远程控制软件。两款软件...

成功Ubuntu18.04 ROS melodic安装Cartograhper+Ceres1.13.0,以及错误总结_ros18.04 安装ca-程序员宅基地

文章浏览阅读1.8k次。二.初始化工作空间三.设置下载地址四.下载功能包此处可能会报错,请看:rosdep update遇到ERROR: error loading sources list: The read operation timed out问题_DD᭄ꦿng的博客-程序员宅基地接下来一次安装所有功能包,注意对应ROS版本 五.编译功能包isolated:单独编译各个功能包,每个功能包之间不产生依赖。编译过程时间比较长,可能需要几分钟时间。此处可能会报错:缺少absl依赖包_ros18.04 安装ca

Harbor2.2.1配置(trivy扫描器、镜像签名)_init error: db error: failed to download vulnerabi-程序员宅基地

文章浏览阅读4.1k次,点赞3次,收藏7次。Haobor2.2.1配置(trivy扫描器、镜像签名)docker-compose下载https://github.com/docker/compose/releases安装cp docker-compose /usr/local/binchmod +x /usr/local/bin/docker-composeharbor下载https://github.com/goharbor/harbor/releases解压tar xf xxx.tgx配置harbor根下建立:mkd_init error: db error: failed to download vulnerability db: database download

推荐文章

热门文章

相关标签