UNSW 9021 quiz1

Quiz 1  

问题背景:

输入两个整数,第一个为seed使每次生成的数字相同设置为arg_for_seed,第二个为生成的数字个数设置为upper_bound。遍历upper_bound的数字个数随机生成1到upper_bound个数字,将大于0的数字存入到mapping字典当中。一共要输出四种情况,分别为:

  1. 正常生成的mapping
  2. mapping中按从小到大排列的key值
  3. 按一个cycle循环给出的正确排序即形成一个闭环
  4. 将mapping倒序排列后,拿key值去寻找对应value。建立一个新的字典,把key值对应的value数量相同的element放在新字典的同一个key值当中

举例描述:

例如:Enter two integers: 20 11

The generated mapping is: {2: 4, 3: 9, 4: 4, 5: 8, 6: 2, 7: 5, 8:11, 9: 1, 10: 10, 11: 5}
The keys are, from smallest to largest: [2,3, 4, 5, 6, 7, 8, 9, 10, 11]
Properly ordered, the cycles given by the mapping are: [[4], [5, 8, 11], [10]]
The (triply ordered)reversed dictionary per lengths is:
{1: {1: [9], 2: [6], 8: [5], 9:[3], 10: [10], 11: [8]}, 2: {4: [2, 4], 5: [7, 11]}}


解决方案及代码:

给出的基本格式和输入
import sys
from random import seed, randrange
from pprint import pprint

try:
    arg_for_seed, upper_bound = (abs(int(x)) + 1 for x in input('Enter two integers: ').split())
except ValueError:
    print('Incorrect input, giving up.')
    sys.exit()

seed(arg_for_seed) #seed()使每次生成的随机数字相同
#情况一
mapping = {}
for i in range(1, upper_bound):
    r = randrange(-upper_bound // 8, upper_bound) #随机生成一个r
    if r > 0:
        mapping[i] = r
print('\nThe generated mapping is:')
print('  ', mapping)

#情况二
keys = sorted(mapping.keys())
print('\nThe keys are, from smallest to largest: ')
print('  ', keys)

cycles = [] #第三问闭环
reversed_dict_per_length = {} #第四问翻转字典

在底部自己加入后两种情况的代码:

情况三

flag = [] #建立一个空列表暂存值
for key in mapping.keys(): #在mapping的key值中循环
    if key in flag: #如果key在flag中则跳出本次循环,执行下一次循环
        continue
    cycle = [key] #否则将key值存入cycle当中
    while True:
        key = mapping[key] #找到当前key值在mapping当中对应的value值,将其赋值给新的key
        if key == cycle[0]: #如果value值对应的新的key值与cycle[0]即原来的key值相等
            cycles.append(cycle) #在总闭环cycles中加入其中一个闭环cycle列表
            flag.extend(cycle) #依次加入一个闭环的每个key值
            break
        elif key not in mapping.keys() or key in cycle: #如果value值对应的新key不在mapping的key值或者已经存在在闭环cycle当中则跳出
            break
        else: #如果value值对应的新key在mapping当中存在且闭环cycle中还没有该值则加入到cycle当中
            cycle.append(key) 
           
print('\nProperly ordered, the cycles given by the mapping are: ')
print('  ', cycles)

情况四

reversed_dic = {} #先建立一个初始翻转字典
for key, value in mapping.items(): #在原始mapping中循环
    if value not in reversed_dic: #如果value不在翻转字典中
        reversed_dic[value] = [key] #加入一个键值对,使value->key,key->value
    else:
        reversed_dic[value].append(key) #如果value即新的key已经存在于翻转字典当中,则在这个新key的value值后加入新的value

for key, value in reversed_dic.items(): #用len(value)进行比较,数值相同的放在一个key中
    if len(value) not in reversed_dict_per_length: #如果该长度不在字典中
        reversed_dict_per_length[len(value)] = {} #在原字典中拿该value值的长度作为key值建立一个新字典
    reversed_dict_per_length[len(value)][key] = value #存入key对应的value值
   
print('\nThe (triply ordered) reversed dictionary per lengths is: ')
pprint(reversed_dict_per_length) #格式化输出

总结

主要考察对字典的运用
仅供参考

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值