描述
附件文件中包含若干条近年的地震相关信息,请实现以下功能完成数据统计,输入输出
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_list
def 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 = 1
if 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 = 1
if flag == 0:
print('无数据')
if __name__ == '__main__':
file = 'quake.csv'
data = read_file(file)
question = input()
type_judge(question)