hnu2021小学期程序设计 电话号码

题目

在这里插入图片描述
具体来说就是有关于字符串的处理以及python的一些数据类型的运用。

思路

首先我们思路分三步,第一步是如何输入,第二步是中间处理,第三步是如何输出。

(1)如何输入

可以看到题中所给的输入是第一行给出电话簿上记录朋友的数目n,下面n行每行都是名字+电话个数+电话的格式,用空格分开。
我们可以考虑用循环输入,将信息输入一个列表中用于使用。

n=eval(input())
num=[]
for i in range(n):
	name=input().split() #split默认是以空格为标识符
	num.append(name) #num成了一个嵌套列表

(2)中间如何处理

可以看见的是那个电话号码的个数对我们没有任何作用。我们主要是对电话号码进行处理,因此可以生成一个字典,键为朋友的名字,值为朋友们的电话号码的总和。

name_dic={}
for i in num:
#如果不在里面 就新建立一个键值对 存放信息
	if not i[0] in name_dic.keys():
		name_dic[i[0]]=i[2:]
#如果已经在里面了 就累加进去
	if i[0] in name_dic.keys():
		name_dic[i[0]]+=i[2:]  

好了现在已经处理好了,name_dic里面是朋友:电话号码了,我们要对这些电话号码进行去重处理以及后缀删去处理,利用集合以及字符串。

name_dic1={}
for u,v in name_dic.items():
	name_dic1[u]=list(set(v))
#以上是对电话号码去重处理

现在便是关键的去除后缀的数的处理,我们可以双重遍历字典的值,来找到这些数的下标。因为若a=‘3’,b=‘123’,则b[len(b)-len(a):]==a

for u in name_dic1.values():
	index=[]
	for i in range(len(u)):
		for j in range(len(u)):
#要全部遍历 不确定正确的电话号码在这个数前还是后
			if i==j:continue #不能自己跟自己比
			if u[i] in u[j]:#默认u[j]是正确的号码
				if u[j][(len(u[j])-len(u[i])):]==u[i]:
					index.append(i)
					break
#看到一个版本上是这里用了set去重还重排了一下,其实该加一个break即可
	temp=0
	if index!=[]:
		for i in index:
			del u[i-temp]
			temp+=1
#因为index是从小到大排序的 删掉一个后后面的序列会少1

这就处理完成了 name_dic1中对应的就是我们所需要的电话号码了

(3)输出

输出要求的第一点是输出有几个朋友,其实就是字典name_dic1的长度
后面按照字典序以及那个什么规律输出名字与电话号码是我收获最大的地方,运用sort与匿名函数(lambda)的结合

匿名函数lambda

在python中声明一个函数与C++中相同,至少要一个函数名如

def f(x):
	return x+1

python由于简便,又给我们提供了一个超级简单的声明函数的方式,使代码更加简便。

lambda x:x+1

lambda +自变量:因变量

sort函数

这个在数据类型这篇博客里面讲过,只是不那么仔细。
sort是用于列表里面的用于快速排序的函数,默认是按数值从小到大排列,但是我们有时候并不想像这样排序,想定义一个自己的排序规则。
sort就像一个迭代器一样,给一个可以迭代的列表,将每个数都迭代进去,再按照从小到大排列,它有一个参数key,默认是给什么返回什么,所以我们可以通过改变它来定义排序规则。
如果列表中全部是字符串,我们像按照字符串长度从小到大排序

A.sort(key=lambda x:len(x))
#每次传入一个x 通过匿名函数变为len(x)

要是字符串有一样长的,我们就按照字符串的大小排序。

A.sort(key=lambda x:(len(x),x)
$在lambda中才用元组的形式输入有优先级的意思
正文

好了匿名函数跟sort都讲完了,现在可以来做题了。

print(len(name_dic1))#先打印出来字典的长度
data=[]#再初始化一个列表 把info存在里面通过循环输出
for u,v in name_dic1:
	info=[]#初始化一个列表 把相关信息存在里面
	info.append(u)
	v.sort(key=lambda x:(len(x),x)
	info.extend(v)
	data.append(info)
data.sort(key=lambda x:x[0])
for i in data:
	print(" ".join(i))
#以前一直会纠结于怎么把一个列表内的数作为字符串输出
#现在终于知道了用join函数 join一个空格就好了 末尾还没有空格

完整代码

n=eval(input())
num=[]
for i in range(n):
	name=input().split() #split默认是以空格为标识符
	num.append(name) #num成了一个嵌套列表
name_dic={}
for i in num:
#如果不在里面 就新建立一个键值对 存放信息
	if not i[0] in name_dic.keys():
		name_dic[i[0]]=i[2:]
#如果已经在里面了 就累加进去
	if i[0] in name_dic.keys():
		name_dic[i[0]]+=i[2:]
name_dic1={}
for u,v in name_dic.items():
	name_dic1[u]=list(set(v))
for u in name_dic1.values():
	index=[]
	for i in range(len(u)):
		for j in range(len(u)):
#要全部遍历 不确定正确的电话号码在这个数前还是后
			if i==j:continue #不能自己跟自己比
			if u[i] in u[j]:#默认u[j]是正确的号码
				if u[j][(len(u[j])-len(u[i])):]==u[i]:
					index.append(i)
					break
#看到一个版本上是这里用了set去重还重排了一下,其实该加一个break即可
	temp=0
	if index!=[]:
		for i in index:
			del u[i-temp]
			temp+=1
#因为index是从小到大排序的 删掉一个后后面的序列会少1
#因为index是从小到大排序的 删掉一个后后面的序列会少1
print(len(name_dic1))#先打印出来字典的长度
data=[]#再初始化一个列表 把info存在里面通过循环输出
for u,v in name_dic1.items():
    info=[]
    info.append(u)
    v.sort(key=lambda x:(len(x),x))
    info.append(str(len(v)))
    info.extend(v)
    data.append(info)
data.sort(key=lambda x:x[0])
for i in data:
	print(" ".join(i))
#以前一直会纠结于怎么把一个列表内的数作为字符串输出
#现在终于知道了用join函数 join一个空格就好了 末尾还没有空格

可以过OJ

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一袍清酒付825

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值