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和’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。但是这样只适用于字符串的实现方式,所以仍需要用递归的方式来写。
- 在每一层列表中,下一层列表被整体看作一个元素,可以使用循环或递归的方式求解。
思路:
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))