描述
附件文件中包含若干条近年的地震相关信息,请实现以下功能完成数据统计,输入输出
quake.csv
参考示例:
1. 输入‘震源深度’,则可以继续输入一个正整数n。
先按震源深度升序排序,并从低到高输出排名前n个地区及震源深度数据
再按震源深度降序排序,并从高到低输出排名前n个地区及震源深度数据
2. 输入‘震级’,则可以继续输入正整数n。
按震级降序排序,并输出震级排名最高的前n名。
3. 输入其他字符串时,如果文件中的地区数据中含有该字符串,则按照文件中顺序输出这些地区和震级,格式为:
如果未找到该字符串,则输出‘无数据’
输入输出示例
| 输入 | 输出 | |
|---|---|---|
| 示例 1 | 震源深度 3 | 从低到高前3名: 吉林延边州珲春市(疑爆):0千米 江苏连云港市灌南县(疑爆):0千米 辽宁抚顺市新抚区(矿震):0千米 从高到低前3名: 斐济群岛地区:640千米 斐济群岛地区:620千米 斐济群岛地区:610千米 |
| 示例 2 | 震级 3 | 斐济群岛地区:8.1级 秘鲁北部:7.8级 斐济群岛地区:7.8级 |
| 示例 3 | 印度洋 | 东南印度洋海岭:5.7 东南印度洋:6.2 中印度洋海岭:5.9 西南印度洋海岭:5.3 西南印度洋海岭:5.9 |
NUMBER = 0 # 编号MAGNITUDE = 1 # 震级TIME = 2 # 发震时刻LATITUDE = 3 # 纬度LONGITUDE = 4 # 经度DEPTH = 5 # 深度POSITION = 6 # 位置def is_number(value):"""当参数可转为数值型时,返回True"""return value.strip().lstrip('-+').replace('.', '', 1).isnumeric()def clean_data(data):"""当参数中的字符串元素可转为数值型时,将其转为数值型当值为整数时转为整数,值为浮点数时转为浮点数"""for lst in data: # 遍历列表中的元素for i in range(len(lst)):if is_number(lst[i]): # 如果是数值型字符串lst[i] = eval(lst[i]) # 转为数值def read_file(file):"""读文件中的数据到列表中,每行数据根据逗号切分为列表"""with open(file, 'r', encoding='UTF-8') as quake_file:quake_file.readline()quake_list = [line.strip().split(',') for line in quake_file]clean_data(quake_list)return quake_listdef depth_of_focus(data, n):"""震源深度"""sort_of_data = sorted(data, key=lambda x: (x[DEPTH], x[NUMBER]))print('从低到高前{}名:'.format(n))for info in sort_of_data[:n]:print('{}:{}千米'.format(info[POSITION], info[DEPTH]))print('\n从高到低前{}名:'.format(n))for info in sort_of_data[-n:][::-1]:print('{}:{}千米'.format(info[POSITION], info[DEPTH]))def magnitude_of_quake(data, n):"""震级,按震级递减对列表中的数据进行排序,震级相同时按编号(数值)递增排序。"""sort_of_data = sorted(data, key=lambda x: (-x[MAGNITUDE], x[NUMBER]))for info in sort_of_data[:n]:print('{}:{}级'.format(info[POSITION], info[MAGNITUDE]))def other_situations(data, user_choice):flag = 0 # 如果不存在,则输出无数据for info in data:if user_choice in info[POSITION]:print('{}:{}'.format(info[POSITION], info[MAGNITUDE]))flag = 1if flag == 0:print('无数据')if __name__ == '__main__':filename = 'quake.csv'quake_data = read_file(filename)choice = input()if choice == '震源深度':num = int(input())depth_of_focus(quake_data, num)elif choice == '震级':num = int(input())magnitude_of_quake(quake_data, num)else:other_situations(quake_data, choice)
def type_judge(input_str):"""接收一个字符串为参数,根据参数调用不同的函数进行运算。"""if input_str == '震源深度':depth_of_focus(data)elif input_str == '震级':magnitude(data)else:others(data)def read_file(filename):"""读文件,返回二维列表"""with open(filename, 'r', encoding='UTF-8') as f:data_lst = [i.strip().split(',') for i in f]return data_lst[1:]def depth_of_focus(data_lst):n = int(input())data_sort_asc = sorted(data_lst, key=lambda x: eval(x[-2]))print('从低到高前{}名:'.format(n))for i in data_sort_asc[:n]:print('{}:{}千米'.format(i[1], i[-2]))print()print('从高到低前{}名:'.format(n))data_sort_desc = sorted(data_lst, key=lambda x: eval(x[-2]),reverse=True)for i in data_sort_desc[:n]:print('{}:{}千米'.format(i[1], i[-2]))def magnitude(data_lst):n = int(input())data_sort = sorted(data_lst, key=lambda x: eval(x[-1]), reverse=True)for i in data_sort[:n]:print('{}:{}级'.format(i[1], i[-1]))def others(data_lst):"""不是上述情况,在地名中查找输入的字符串,如果存在,则输出该地区数据"""flag = 0 # 如果不存在,则输出无数据for line in data_lst:if question in line[1]:print('{}:{}'.format(line[1], line[-1]))flag = 1if flag == 0:print('无数据')if __name__ == '__main__':file = 'quake.csv'data = read_file(file)question = input()type_judge(question)
