华为OD-磁盘容量排序

磁盘容量

题目描述

磁盘的容量单位常用的有M、G、T

他们之间的换算关系为1T =1024G,1G=1024M

现在给定n块磁盘的容量,请对他们按从小到大的顺序进行稳定排序

例如给定5块盘的容量

5

1T

20M

3G

10G6T

3M12G9M

排序后的结果为

20M

3G

3M12G9M

1T

10G6T

注意单位可以重复出现

上述3M12G9M表示的容量即为3M12G9M和12M12G相等

输入描述

输入第一行包含一个整数n,2 <= n<= 100,表示磁盘的个数。

接下来的n行,每行一个字符串,2 < 长度 < 30,表示磁盘的容量,

由一个或多个格式为MV的子串组成,其中M表示容量大小,V表示容量单位,

例如20M、1T。

磁盘容量的范围1 ~ 1024的正整数,单位M、G、T。

输出描述

输出n行

表示n块磁盘容量排序后的结果

示例一

输入

3
1G
2G
1024M

输出

1G
1024M
2G

说明

稳定排序要求相等值保留原来位置

示例二

输入

3
2G4M
3M2G
1T

输出

3M2G
2G4M
1T

代码

import re

disk_num = int(input())
disk_list = []
for i in range(disk_num):
    disk_list.append(input())
disk_array = {}
disk_total = []
for i in range(disk_num):
    key = re.findall(r'[TGM]', disk_list[i])
    val = re.findall(r'[0-9]{1,}', disk_list[i])
    for j in range(len(key)):
        if disk_array.get(key[j]) == None:
            disk_array[key[j]] = int(val[j])
        else:
            disk_array[key[j]] += int(val[j])
    # print(disk_array)
    sum_disk = 0
    for k, v in disk_array.items():

        if k == 'T':
            sum_disk += (v * 1024 * 1024)
        elif k == 'G':
            sum_disk += (v * 1024)
        elif k == 'M':
            sum_disk += v
    # print(sum_disk)
    disk_array = {}
    disk_total.append(sum_disk)
    # print(disk_total)
disk_sort = sorted(list(zip(disk_list, disk_total)), key=lambda x: x[1])
for i in range(disk_num):
    print(disk_sort[i][0])

代码解读

这段代码实现了一个程序,它接收用户输入的一组硬盘容量信息,并按照硬盘总容量从小到大的顺序输出这组硬盘信息。
程序首先读取用户输入的硬盘数量,并使用一个 for 循环将每个硬盘信息添加到列表 disk_list 中。
接下来,程序定义了一个空字典 disk_array 和一个空列表 disk_total,用于存储每个硬盘的容量信息。
接着,程序使用正则表达式从每个硬盘信息中提取出容量和单位的信息,并将其添加到字典 disk_array 中。
然后程序根据每个硬盘的容量信息计算出其总容量,将其添加到列表 disk_total 中。
在计算完每个硬盘的总容量之后,
程序将字典 disk_array 重新赋值为空字典,以便下一个硬盘的容量信息使用。
程序将每个硬盘的总容量和硬盘信息组成一个元组,添加到列表 disk_sort 中。
最后,程序使用 sorted 函数对列表 disk_sort 进行排序,
并按照硬盘总容量从小到大的顺序依次输出硬盘信息。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值