如何修改Python无依赖生成的字符折线图代码以标记最低点
字符折线图添加最低点标记修改方案
你只需要对原有代码做3处修改即可实现最低点标记功能,修改点如下:
1. 修改最值计算函数,新增最低点索引记录
原有函数只返回了最大值、最大值索引、最小值,没有记录最小值对应的索引,我们需要补充该逻辑:
def get_Max_and_MaxIndex_MinIndex(num_list): # get maximul value, its index and minimum value sign = 1 val = 0 max_val = 0 min_val = 0 max_ind = 0 min_ind = 0 # 新增:存储最小值索引 count = 0 for num in num_list: count += 1 val = val + sign * num sign = -1 * sign if (max_val < val): max_val = val max_ind = count if (min_val > val): min_val = val min_ind = count # 新增:更新最小值索引 return max_val, max_ind, min_val, min_ind # 新增:返回最小值索引
2. 主程序中新增最低点横坐标计算逻辑
在原有最高点横坐标计算完成后,补充最低点横坐标的计算:
# 原有最高点横坐标计算 start_num = 0 for i in range(max_min_num[1]): start_num += num_input[i] # maximum height element number # 新增:计算最低点横坐标 min_start_num = 0 for i in range(max_min_num[3]): min_start_num += num_input[i]
3. 折线打印完成后新增最低点标记打印逻辑
原有代码只在折线上方打印了最高点标记,我们在折线打印完成后补充最低点的标记:
# 原有折线打印逻辑 for indr in range(row_num - 1, -1, -1): print("".join(print_data[indr])) # 新增:打印最低点标记 print(" " * max(0, min_start_num - 1) + "< >" + " " * (col_num - min_start_num - 1)) print(" " * max(0, min_start_num - 1) + "\\|/" + " " * (col_num - min_start_num - 1)) print(" " * min_start_num + "o" + " " * (col_num - min_start_num))
修改后完整代码
data = input("Input:") def parse_to_int(dat): # parse input data to int list individuals = dat.split(" ") num = [] for individual in individuals: num.append((int)(individual)) return num def get_Max_and_MaxIndex_MinIndex(num_list): # get maximul value, its index and minimum value sign = 1 val = 0 max_val = 0 min_val = 0 max_ind = 0 min_ind = 0 count = 0 for num in num_list: count += 1 val = val + sign * num sign = -1 * sign if (max_val < val): max_val = val max_ind = count if (min_val > val): min_val = val min_ind = count return max_val, max_ind, min_val, min_ind def sub_sum(ind): # calculate subsum until ind global num_input global subsum subsum = 0 for i in range(ind + 1): subsum += num_input[i] return subsum def sub_sum_with_sign(ind): # calculate subsum with sign until ind global num_input global subsum_withsign subsum_withsign = 0 sign = 1 for i in range(ind + 1): subsum_withsign += sign * num_input[i] sign = -1 * sign return subsum_withsign def fill_data(ind): # fill data for print in empty data global print_data global cur_x global cur_y if ind % 2 == 0: str = '/' dx = 1 dy = 1 else: str = '\\' dx = 1 dy = -1 for _ in range(num_input[ind]): print_data[cur_y][cur_x] = str cur_x += dx cur_y += dy if ind % 2 == 0: cur_y -= 1 else: cur_y += 1 return print_data # main program num_input = parse_to_int(data) col_num = 0 # column count for elem in num_input: col_num += elem max_min_num = get_Max_and_MaxIndex_MinIndex(num_input) max_val, max_ind, min_val, min_ind = max_min_num row_num = max_val - min_val # row count start_num = 0 for i in range(max_ind): start_num += num_input[i] # maximum height element number # 计算最低点横坐标 min_start_num = 0 for i in range(min_ind): min_start_num += num_input[i] subsum = 0 subsum_withsign = 0 cur_x = 0 cur_y = -1 * min_val # start output print("Output:\n") # 打印最高点标记 print(" " * start_num + "o" + " " * (col_num - start_num)) print(" " * max(0, start_num - 1) + "/|\\" + " " * (col_num - start_num - 1)) print(" " * max(0, start_num - 1) + "< >" + " " * (col_num - start_num - 1)) # prepare data for print print_data = [] for i in range(row_num): print_data.append([]) for j in range(col_num): print_data[i].append(" ") for ind in range(len(num_input)): fill_data(ind) # print data for indr in range(row_num - 1, -1, -1): print("".join(print_data[indr])) # 打印最低点标记 print(" " * max(0, min_start_num - 1) + "< >" + " " * (col_num - min_start_num - 1)) print(" " * max(0, min_start_num - 1) + "\\|/" + " " * (col_num - min_start_num - 1)) print(" " * min_start_num + "o" + " " * (col_num - min_start_num))
内容的提问来源于stack exchange,提问作者Ahmad Yasin
相关产品推荐
相关产品推荐

