buctoj-python 2022.5.12

问题 A: 字典更新

题目描述

现有字典:dict1 = {‘赵广辉’: ‘13299887777’, ‘Trump’: ‘814666888’, ‘Putin’:
‘522888666’, ‘吴京’: ‘13999887777’}
尝试修改一个键值对,姓名和电话在两行里输入,如果输入的键在字典中存在,则用新输入的电话号码替换原来的号码,如输入的键在字典中不存在则输出“数据不存在”。操作完成后输出字典中所有键值对。

输入

两行,第一行是一个姓名,第二行是电话号码

输出

参考示例

样例输入 复制

李广
13299885566

样例输出 复制

数据不存在

赵广辉:13299887777

Trump:814666888

Putin:522888666

吴京:13999887777

dict1 = {'赵广辉': '13299887777', '特朗普': '814666888', '普京': '522888666', '吴京': '13999887777'} 
name=input()
tel=input()
if name in dict1:
    dict1[name]=tel
else:
    print("数据不存在")
for key in dict1: #遍历键,输出键值对
    print(f"{key}:{dict1.get(key)}")

问题 B: 排序输出字典中数据

题目描述

有两个字典数据如下: dic1 = {‘Tom’:21,‘Bob’:18,‘Jack’:23,‘Ana’:20} dic2 =
{‘李雷’:21,‘韩梅梅’:18,‘小明’:23,‘小红’:20}‪‬‪‬‪‬‪‬‪‬‮‬‫‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‫‬
请将dic1按键的大小升序排序,将dic2按值的大小升序排序,输出dic1的前n个键的内容,输出dic2前n个键值对。当n大于元素个数时,按实际元素数量输出。

输入

输入一个正整数n

输出

输出指定个数的排序后的元素

样例输入 复制

2

样例输出 复制

[‘Ana’, ‘Bob’]
[(‘韩梅梅’, 18), (‘小红’, 20)]

dic1 = {'Tom':21,'Bob':18,'Jack':23,'Ana':20}
dic2 = {'李雷':21,'韩梅梅':18,'小明':23,'小红':20}
n=int(input())
#new_sys1=sorted(dic1.items(),key=lamda d:d[0],reverse=False)
new_sys1=sorted(dic1) #直接对字典排序返回升序的键数列
new_sys2=sorted(dic2.items(), key=lambda d:d[1], reverse=False)
#dic2.items()返回键值对,排序关键字为值,False默认升序

if n<=len(new_sys1):
    print(new_sys1[:n])
else:
    print(new_sys1)
    
if n<=len(new_sys2):
    print(new_sys2[:n])
else:
    print(new_sys2)

问题 C: 打印商品名

题目描述

读入以空格分隔的多个商品名,例如:Iphone7 MacPro 小米6 Vivo Oppo,将其按如下格式输出:‪‬‪‬‪‬‪‬‪‬‮‬‫‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‫‬
商品列表:‪‬‪‬‪‬‪‬‪‬‮‬‫‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‫‬
0    Iphone7‪‬‪‬‪‬‪‬‪‬‮‬‫‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‫‬
1    MacPro‪‬‪‬‪‬‪‬‪‬‮‬‫‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‫‬
2    小米6‪‬‪‬‪‬‪‬‪‬‮‬‫‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‫‬
3    Vivo‪‬‪‬‪‬‪‬‪‬‮‬‫‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‫‬
4    Oppo

输入

输入为一行,是用空格分隔的多个商品名。

输出

输出为多行,第一行为“商品列表:”,从第二行开始为序号(从0开始编号)和商品名,序号和商品名之间以一个制表符( ‘\t’ )分隔。

样例输入 复制

Iphone7 MacPro 小米6 Vivo Oppo

样例输出 复制

商品列表:
0	Iphone7
1	MacPro
2	小米6
3	Vivo
4	Oppo
phone=input().split(' ')
dic={}
for i in range(len(phone)):
    dic[i]=phone[i]
print("商品列表:")
for i in range(len(phone)):
    print(f"{i}\t{dic.get(i)}")

问题 D: 插入位置

题目描述

对一个有序的整数序列,现在要将一个整数插入进去,并保证该序列仍然有序。请输出这个数要插入的位置‪‬‪‬‪‬‪‬‪‬‮‬‫‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‫‬
第一行输入若干个整数,以空格间隔,本题保证用例中输入的数值顺序一定是从小到大,原始列表中无重复数据‪‬‪‬‪‬‪‬‪‬‮‬‫‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‫‬
第二行输入一个整数n‪‬‪‬‪‬‪‬‪‬‮‬‫‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‫‬
将整数序列放入列表ls‪‬‪‬‪‬‪‬‪‬‮‬‫‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‫‬
如果ls中已经存在n,则不插入该数,输出
'Fail’以及ls列表‪‬‪‬‪‬‪‬‪‬‮‬‫‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‫‬
若ls中可以插入n,输出插入位置,以及插入后的ls列表

样例输入 复制

1 2 3 5
4

样例输出 复制

3
[1,2,3,4,5]
l=input().split()
for i in range(len(l)):
    l[i]=int(l[i])
n=int(input())
for i in range(len(l)):
    if l[i]==n:
        print("Fail")
        print(l)
        break
    elif l[i]<n<l[i+1] and i<len(l)-1:
        l.insert(i+1,n)
        print(i+1)
        print(l)
        break
    elif n<l[0]:
        l.insert(0,n)
        print("0")
        print(l)
        break
    elif n>l[len(l)-1]:
        l.append(n)
        print(len(l)-1)
        print(l)
        break
    #后面的许多print可以简化为一个出口,这个代码显臃肿

问题 E: 字符串压缩

题目描述

输入一个字符串s,s由若干个非数字的字符组成且相同的字符保证连续排列,将字符串按照下列规则进行长度压缩‪‬‪‬‪‬‪‬‪‬‮‬‫‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‫‬
将字符放前面,出现次数放后面,如果出现1次,则不需要保存次数‪‬‪‬‪‬‪‬‪‬‮‬‫‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‫‬
按照字符在s中出现的顺序输出压缩后的字符串.‪‬‪‬‪‬‪‬‪‬‮‬‫‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‫‬
输入:字符串‪‬‪‬‪‬‪‬‪‬‮‬‫‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‫‬
输出(三行):字典形式,键值对为
字符:出现次数‪‬‪‬‪‬‪‬‪‬‮‬‫‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‫‬
原字符串长度‪‬‪‬‪‬‪‬‪‬‮‬‫‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‫‬
压缩后字符串‪‬‪‬‪‬‪‬‪‬‮‬‫‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‫‬
压缩后字符串长度‪‬‪‬‪‬‪‬‪‬‮‬‫‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‫‬
abbc&&+++ {‘a’: 1, ‘b’: 2, ‘c’: 1, ‘&’: 2, ‘+’: 3} 9 ab2c&2+3
8‪‬‪‬‪‬‪‬‪‬‮‬‫‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‫‬
如果输入的s中有数字字符,直接输出‘ERROR’

样例输入 复制

abcc(((())))

样例输出 复制

{'a': 1, 'b': 1, 'c': 2, '(': 4, ')': 4}
12
abc2(4)4
8
s=input()
d={}
sLen=len(s)
flag=0
for i in range(sLen):
    if '0'<=s[i]<='9':
        flag=1
        break;
    d[s[i]]=d.get(s[i],0)+1
if flag==1:
    print('ERROR')
else:
    print(d)
    print(sLen)
    dLen=len(d)
    i=0
    while i<sLen:
        print(f"{s[i]}",end='')
        v=d.get(s[i],0)
        if v!=1:
            print(d.get(s[i],0),end='')
            i+=v
            tmp=0
            while v!=0: #计算数字占位
                v//=10
                tmp+=1
            dLen+=tmp
        else:
            i+=1
    print("")
    print(dLen)

可以优化,把要输出的新字符串存起来一起输出,长度用len函数

问题 F: 对数据进行排序

题目描述

输入10个数据,对数据进行排序,要求有从大到小,从小到大,倒序排序3种排序方式

输入

10个数据,用英文逗号隔开

输出

见样例

样例输入 复制

1,100,23,4.5,23,7,9,0,999999,10

样例输出 复制

倒序排序后为: [10, 999999, 0, 9, 7, 23, 4.5, 23, 100, 1]
按从小到大的顺序为: [0, 1, 4.5, 7, 9, 10, 23, 23, 100, 999999]
按从大到小的顺序为: [999999, 100, 23, 23, 10, 9, 7, 4.5, 1, 0]
l=input().split(',')
for i in range(len(l)):
    l[i]=eval(l[i])
l=l[::-1]
print("倒序排序后为: ",end='')
print(l)
 
l.sort()
print("按从小到大的顺序为: ",end='')
print(l)
 
l.sort(reverse=True)
print("按从大到小的顺序为: ",end='')
print(l)

问题 G: 统计输入

题目描述

输入10个数据,再输入任意一个数值,统计输入的任意值出现的次数,同时完成10个数据平均值,最大值和最小值的计算

输入

输入10个数据,用英文逗号隔开
输入任意一个数值

输出

见样例

样例输入 复制

0,0,10,23,0.98,-0.4444,7,8,9,98
0

样例输出 复制

0 共出现 210个数据的平均值为 15.55356
10个数据的最大值为 98
10个数据的最小值为 -0.4444
l=input().split(',')
n=int(input())
sum=0
max=-999999999
min=99999999
cnt=0
for i in range(len(l)):
    l[i]=eval(l[i])
    sum+=l[i]
    if l[i]>max:max=l[i]
    if l[i]<min:min=l[i]
    if l[i]==n:cnt+=1
sum/=len(l)
print(f"{n} 共出现 {cnt} 次")
print(f"{len(l)}个数据的平均值为 {sum}")
print(f"{len(l)}个数据的最大值为 {max}")
print(f"{len(l)}个数据的最小值为 {min}")

注意输出格式

问题 H: 完数判断

题目描述

输入一个数,判断其是否是完数(完数就是其所有真因子的和,恰好等于它本身)

输入

一个数

输出

见样例

样例输入 复制

5

样例输出 复制

5 的真约数为: [1]
不是完数
n=int(input())
s=set()
i=1
sum=0
while i<n :
    if n%i==0:
        s.add(i)
        sum+=i
    i+=1
s=list(s)
print(f"{n} 的真约数为: ",end='')
print(s)
if sum==n:print("是完数")
else:print("不是完数")

用了集合,没必要,其实用list就行,list.append追加
真约数是除了自己本身以外的因数,如8的真约数是1,2,4

问题 I: 查找键对应的值

题目描述

输入一个整数N,创建字典{1:1,2:4,3:9…,N:N*N},再从键盘输入一个整数M(M<=N),要求查找键M对应的值。

输入

整数N 整数M

输出

见样例

样例输入 复制

5
4

样例输出 复制

{1: 1, 2: 4, 3: 9, 4: 16, 5: 25}4 对应的值为: 16
n=int(input())
m=int(input())
d={}
for i in range(1,n+1):
    d[i]=i*i
print(d)
print(f"键 {m} 对应的值为: {d.get(m,0)}")

问题 J: 随机密码生成

题目描述

编写一个函数,在26个字母(大小写)和9个数字组成的列表中随机生成10个8位密码。

输入

随机种子n

输出

见样例

样例输入 复制

5

样例输出 复制

1个密码为:nQvWys81
第2个密码为:vp7hB1dx
第3个密码为:8PpD5KHX
第4个密码为:e3PYiGkP
第5个密码为:AuNaRL63
第6个密码为:xYKwzEIn
第7个密码为:ncIIA3AN
第8个密码为:xNK3KSUM
第9个密码为:i4roNL8s
第10个密码为:M5YTBXaK
from random import *
n=eval(input()) #会出现浮点型数据
seed(n)
for i in range(10):
    uppletter=[chr(i) for i in range(65,91)]
    lowletter=[chr(i) for i in range(97,123)]
    digit=[chr(i) for i in range(48,57)]#经过试验这题里的九个数是0~8
    #有函数可以直接生成大小写字母,这里手写了一个
    #string.ascii_lowercase可返回26个小写字母字符串
    #string.ascii_uppercase可返回26个大写字母字符串
    l=uppletter+lowletter+digit
    s=choice(l)
    for j in range(7):
        s+=choice(l)
    print(f"第{i+1}个密码为:{s}")

你可能感兴趣的:(buctoj,python)