题目描述与分析
题目描述:
假设你手里有一串钥匙,这串钥匙上每把钥匙都有一个编号,对应着一个房门的编号。现给你一个房门编号,你需要判断是否能够打开该房门。
输入描述:
测试数据共有多组。
第一行为一个整数 s,表示共有多少组测试数据。
每组第一行有一个整数 n,表示钥匙串上有多少把钥匙。
后面共有 n 行输入,每行两个整数,第一个整数 k 表示钥匙编号,第二个整数 d 表示房门编号。
最后一行有一个整数 x,表示需要打开的房门编号。
输出描述:
输出多组,每组占一行。 如果能打开,则输出钥匙编号,不能打开则输出“Can’t open the door.”。
输入示例:
2
5
878788 9373833
837837 3837378
378338 3398939
388733 2329389
878373 3938399
3938399
3
998389 3892393
444323 3892783
883782 5334332
8739833
输出示例:
878373
Can't open the door.
一、map的基本介绍
我们常常把map称之为映射,就是将一个元素(通常称之为key键)与一个相对应的值(通常称之为value)关联起来,比如说一个学生的姓名(key)有与之对应的成绩(value),它们是一一对应的,就好像一把钥匙开一扇门,在map中键是唯一的,也只有一个唯一的确定的值。
比如下面的图示:左边是 key, 每一个姓名都对应着一个 成绩 value。
而在Python中,通常用**字典dict**实现了映射这种数据结构。
字典也是使用{}来包裹,每个键值对用冒号:分隔,键值对与键值对之间用逗号,分隔,其具体格式如下:
my_dict = {
"mike", 99,
"tom": 98,
"jerry": 100
}
字典中的键数据类型必须是不可变的(字符串、数字、元组等), 但是值可以是任意的数据类型。
此外,也使用内置函数 dict()创建字典,如果想要给字典添加键值对,可以直接通过dict[key] = value的形式。
# 创建一个空字典
my_dict = dict()
# 添加键值对
my_dict["mike"] = 99
my_dict["tom"] = 98
my_dict["jerry"] = 100
# 更新值
my_dict["mike"] = 100
# 访问值
print(my_dict["mike"]) # 100
如果想要删除字典中的键值对可以使用del()或者clear()方法
del my_dict["mike"] # 删除对应的键值对
my_dict.clear() # 清空字典
del my_dict # 删除字典
检查字典中的键是否存在也是使用in来判断, 如果键在字典中返回 true, 否则 返回 false 。
if "mike" in my_dict:
print(my_dict["mike"])
else:
print("mike doesn't exist in the dictionary")
字典的遍历需要搭配使用for和dict.items(), items()方法返回了字典中的所有键值对的视图对象。这个视图对象可以用于迭代字典中的键值对。
for key, value in my_dict.items():
print(f"Key: {key}, Value: {value}")
此外,还可以使用dict.keys()和dict.values()获取字典的所有键的视图对象和所有值的视图对象,视图对象可以通过list()转为列表。
二、代码编写
程序逻辑和前面的一样,首先读取 s 表示测试用例的数量,然后进行 s 次迭代
s = int(input()) # 读取测试用例的数量
for _ in range(s):
umap = {} # 创建一个空的字典
每组数据第一行为一个整数 n ,表示钥匙串上有多少把钥匙, 之后进行 n 行数据的输入,每行两个整数,第一个整数 k 表示钥匙编号,第二个整数 d 表示房门编号。
n = int(input()) # 读取键值对的数量
for _ in range(n):
# 读取字符串,拆分成列表后,转为整数,第一个整数表示钥匙编号,第二个整数表示房门编号
key, door = map(int, input().split())
# 将键值对放入字典中
umap[key] = door
此时,所有输入的数据都已经被放置到字典中,我们要获取需要查询的房门编号,并判断房门编号是否在字典中,如果存在,输入对应的钥匙编号,如果不存在,输出对应的语句。
x = int(input()) # 读取需要查找的房门编号
flag = True # 设置一个 flag 标识,首先假设没有对应的房门编号
for key, door in umap.items(): # 遍历字典中的键值对
if door == x: # 如果找到匹配的房门编号
print(key) # 输出对应的键,也就是钥匙编号
flag = False # 当找到对应的房门编号后,flag变为 False
break # 退出遍历
# 当遍历完所有的键值对,flag仍为true时,说明没有对应的房门编号,输出语句
if flag:
print("Can't open the door.")
完整代码如下:
s = int(input()) # 读取测试用例的数量
for _ in range(s):
umap = {} # 创建一个空的字典
n = int(input()) # 读取键值对的数量
for _ in range(n):
# 第一个整数表示钥匙编号,第二个整数表示房门编号
key, door = map(int, input().split())
umap[key] = door
x = int(input()) # 读取需要查找的房门编号
flag = True
for key, door in umap.items(): # 遍历字典中的键值对
if door == x: # 如果找到匹配的门
print(key) # 输出对应的键
flag = False
break
# 如果没有找到匹配的门,输出对应的语句
if flag:
print("Can't open the door.")
到此为止,Python中内置的数据结构,我们大多都已经接触到了,包括列表、元组、字符串、字典、集合、范围等等,它们都是可迭代的对象,所谓可迭代对象表示包含多个元素并允许按顺序访问这些元素的对象。你可以使用for循环来遍历可迭代对象。