Python练习 4.19 ~ 4.25

Python练习 4.19 ~ 4.25

第5章-11 字典合并

字典合并。输入用字符串表示两个字典,输出合并后的字典,字典的键用一个字母或数字表示。注意:1和‘1’是不同的关键字!

输入格式:

在第一行中输入第一个字典字符串 在第二行中输入第二个字典字符串

输出格式:

在一行中输出合并的字典,输出按字典序。"1"的ASCII吗为49,大于1,排序时1在前,"1"在后,其它的也一样。

输入样例1:

在这里给出一组输入。例如:

{1:3,2:5}
{1:5,3:7}
输出样例1:

在这里给出相应的输出。例如:

{1:8,2:5,3:7}
输入样例2:

在这里给出一组输入。例如:

{"1":3,1:4}
{"a":5,"1":6}
输出样例2:

在这里给出相应的输出。例如:

{1:4,"1":9,"a":5}

难点:

  1. 对字典的操作不熟悉;
  2. 可能产生的多种情况,如1和’1’等。

思路(含注释的代码):

a = dict(eval(input()))
b = dict(eval(input()))
# 输入两个字典
for i in b:
    if i not in a:
        a[i]=b[i]
        # 如果b中的元素不在a中,则在a中添加以i为索引的元素a[i] = b[i]
    else:
        a[i]+=b[i]
        # 如果a中含有字典b中,以i为索引的元素,则将两元素相加 
print('{',end='')
s1=[i for i in a.keys() if type(i) == type(1)]
s2=[i for i in a.keys() if type(i) == type('a')]
# 将可能出现的索引类型分类
s1.sort()
s2.sort()
# 根据ASCII码,将索引排序
c=0
n=len(a)
for i in s1+s2:
    # 遍历所有索引
    c+=1
    if type(i)==type(1):
        print('{}:{}'.format(i,a[i]),end='')
    else:
        print('"{}":{}'.format(i,a[i]),end='')
    if c!=n:
        print(',',end='')
        # 格式化输出:如果还未输入到n个元素,则插入分隔符
print('}')

强调:

通过本题,掌握了处理字典的不同方法,以写简单测试代码的方式,清楚了字典中,a、i、a[i]等在输入、
操作上的区别。

第6章-2 一帮一

“一帮一学习小组”是中小学中常见的学习组织方式,老师把学习成绩靠前的学生跟学习成绩靠后的学生排在一组。本题就请你编写程序帮助老师自动完成这个分配工作,即在得到全班学生的排名后,在当前尚未分组的学生中,将名次最靠前的学生与名次最靠后的异性学生分为一组。

输入格式:

输入第一行给出正偶数N(≤50),即全班学生的人数。此后N行,按照名次从高到低的顺序给出每个学生的性别(0代表女生,1代表男生)和姓名(不超过8个英文字母的非空字符串),其间以1个空格分隔。这里保证本班男女比例是1:1,并且没有并列名次。

输出格式:

每行输出一组两个学生的姓名,其间以1个空格分隔。名次高的学生在前,名次低的学生在后。小组的输出顺序按照前面学生的名次从高到低排列。

输入样例:
8
0 Amy
1 Tom
1 Bill
0 Cindy
0 Maya
1 John
1 Jack
0 Linda
输出样例:
Amy Jack
Tom Linda
Bill Maya
Cindy John

难点:

数据结构的实现,第一次的思路是创建男生和女生两个列表,然后根据输入的顺序模拟出队、入队,
问题在于确定输出顺序时,逻辑顺序上比较复杂,涉及到数学上的关系。虽然匹配成功,但输出顺序不对。

思路:

在创建男生、女生两个列表的同时,创建一个全班同学的链表,方便了所有同学的遍历,
同时在匹配上采用 male[-female.index( p )-1]) + female[-male.index( p )-1]) 的语法,
实现了两个列表之间元素的互相匹配。注意:在列表中,print(a[-1]) 的结果为 0
另外,此题用堆栈、树等简单的数据结构应该可以实现,有待思考。

n = int(input())
male = []
female = []
students = []
for i in range(n):
    gen, name = input().split()
    gen = int(gen)
    if gen == 0:
        female.append(name)
        students.append(name)
    elif gen == 1:
        male.append(name)
        students.append(name)

for p in students[:int(n/2)]:
    if p in female:
        print(p+' '+male[-female.index(p)-1])
    else:
        print(p+' '+female[-male.index(p)-1])

第6章-3 列表或元组的数字元素求和

求列表中数字和,列表中嵌套层次不限2层

输入格式:

在一行中输入列表或元组

输出格式:

在一行中输出数字的和

输入样例:

在这里给出一组输入。例如:

[11,2,[3,7],(68,-1),"123",9]
输出样例:

在这里给出相应的输出。例如:

99

难点:

在输入[11,2,[3,7],(68,-1),“123”,9]中,[3,7]被看作一个单独的元素,(68,-1)被看作一个单独的元素,
而非分为单个数字判断。注意元素如果是列表的时候,需要嵌套一层循环。

思路:

def func(data):
    check = []
    for ele in data:
        if type(ele) == list or type(ele) == tuple:
            for sub in func(ele):
                check.append(sub)
        elif type(1) == type(ele):
            check.append(ele)
    return check

test = eval(input())
print(sum(func(test)))

第6章-4 列表数字元素加权和(1)

输入一个嵌套列表,嵌套层次不限,根据层次,求列表元素的加权和。第一层每个元素 的值为:元素值1,第二层每个元素的值为:元素值2,第三层每个元素的值为:元素值*3, …,以此类推!

输入格式:

在一行中输入列表

输出格式:

在一行中输出加权和

输入样例:

在这里给出一组输入。例如:

[1,2,[3,4,[5,6],7],8]
输出样例:

在这里给出相应的输出。例如:

72

难点:

  1. 第一次完成的时候忽略了输入列表的条件,直接使用了处理字符串的方式,参考了数据结构中计算器的实现方法,即如果碰到"[",权值+1,碰到"]"权值-1。但是这样只适用于字符串的实现方式,所以仍需要用递归的方式来写。
  2. 在每一层列表中,下一层列表被整体看作一个元素,可以使用循环或递归的方式求解。

思路:

def func(data, quantity) :
    cal = 0
    for ele in data:
        if type(ele) == int:
            cal += ele*quantity
        elif type(ele) == list: # 如果非单元数字,则递归进行函数调用
            cal += func(ele, quantity+1)
    return cal

test = eval(input())
print(func(test, 1))
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值