描述

附件文件中包含若干条近年的地震相关信息,请实现以下功能完成数据统计,输入输出
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
  1. NUMBER = 0 # 编号
  2. MAGNITUDE = 1 # 震级
  3. TIME = 2 # 发震时刻
  4. LATITUDE = 3 # 纬度
  5. LONGITUDE = 4 # 经度
  6. DEPTH = 5 # 深度
  7. POSITION = 6 # 位置
  8. def is_number(value):
  9. """当参数可转为数值型时,返回True"""
  10. return value.strip().lstrip('-+').replace('.', '', 1).isnumeric()
  11. def clean_data(data):
  12. """当参数中的字符串元素可转为数值型时,将其转为数值型
  13. 当值为整数时转为整数,值为浮点数时转为浮点数"""
  14. for lst in data: # 遍历列表中的元素
  15. for i in range(len(lst)):
  16. if is_number(lst[i]): # 如果是数值型字符串
  17. lst[i] = eval(lst[i]) # 转为数值
  18. def read_file(file):
  19. """读文件中的数据到列表中,每行数据根据逗号切分为列表"""
  20. with open(file, 'r', encoding='UTF-8') as quake_file:
  21. quake_file.readline()
  22. quake_list = [line.strip().split(',') for line in quake_file]
  23. clean_data(quake_list)
  24. return quake_list
  25. def depth_of_focus(data, n):
  26. """震源深度"""
  27. sort_of_data = sorted(data, key=lambda x: (x[DEPTH], x[NUMBER]))
  28. print('从低到高前{}名:'.format(n))
  29. for info in sort_of_data[:n]:
  30. print('{}:{}千米'.format(info[POSITION], info[DEPTH]))
  31. print('\n从高到低前{}名:'.format(n))
  32. for info in sort_of_data[-n:][::-1]:
  33. print('{}:{}千米'.format(info[POSITION], info[DEPTH]))
  34. def magnitude_of_quake(data, n):
  35. """震级,按震级递减对列表中的数据进行排序,震级相同时按编号(数值)递增排序。"""
  36. sort_of_data = sorted(data, key=lambda x: (-x[MAGNITUDE], x[NUMBER]))
  37. for info in sort_of_data[:n]:
  38. print('{}:{}级'.format(info[POSITION], info[MAGNITUDE]))
  39. def other_situations(data, user_choice):
  40. flag = 0 # 如果不存在,则输出无数据
  41. for info in data:
  42. if user_choice in info[POSITION]:
  43. print('{}:{}'.format(info[POSITION], info[MAGNITUDE]))
  44. flag = 1
  45. if flag == 0:
  46. print('无数据')
  47. if __name__ == '__main__':
  48. filename = 'quake.csv'
  49. quake_data = read_file(filename)
  50. choice = input()
  51. if choice == '震源深度':
  52. num = int(input())
  53. depth_of_focus(quake_data, num)
  54. elif choice == '震级':
  55. num = int(input())
  56. magnitude_of_quake(quake_data, num)
  57. else:
  58. other_situations(quake_data, choice)
  1. def type_judge(input_str):
  2. """接收一个字符串为参数,根据参数调用不同的函数进行运算。
  3. """
  4. if input_str == '震源深度':
  5. depth_of_focus(data)
  6. elif input_str == '震级':
  7. magnitude(data)
  8. else:
  9. others(data)
  10. def read_file(filename):
  11. """读文件,返回二维列表"""
  12. with open(filename, 'r', encoding='UTF-8') as f:
  13. data_lst = [i.strip().split(',') for i in f]
  14. return data_lst[1:]
  15. def depth_of_focus(data_lst):
  16. n = int(input())
  17. data_sort_asc = sorted(data_lst, key=lambda x: eval(x[-2]))
  18. print('从低到高前{}名:'.format(n))
  19. for i in data_sort_asc[:n]:
  20. print('{}:{}千米'.format(i[1], i[-2]))
  21. print()
  22. print('从高到低前{}名:'.format(n))
  23. data_sort_desc = sorted(data_lst, key=lambda x: eval(x[-2]),reverse=True)
  24. for i in data_sort_desc[:n]:
  25. print('{}:{}千米'.format(i[1], i[-2]))
  26. def magnitude(data_lst):
  27. n = int(input())
  28. data_sort = sorted(data_lst, key=lambda x: eval(x[-1]), reverse=True)
  29. for i in data_sort[:n]:
  30. print('{}:{}级'.format(i[1], i[-1]))
  31. def others(data_lst):
  32. """不是上述情况,在地名中查找输入的字符串,如果存在,则输出该地区数据"""
  33. flag = 0 # 如果不存在,则输出无数据
  34. for line in data_lst:
  35. if question in line[1]:
  36. print('{}:{}'.format(line[1], line[-1]))
  37. flag = 1
  38. if flag == 0:
  39. print('无数据')
  40. if __name__ == '__main__':
  41. file = 'quake.csv'
  42. data = read_file(file)
  43. question = input()
  44. type_judge(question)