需要制作直方图的建议吗

2024-05-19 21:56:02 发布

您现在位置:Python中文网/ 问答频道 /正文

所以我需要做一个柱状图。我当前的打印看起来像这样,来自我在文章底部的代码。在比较my输出和示例输出时,可以看到一些问题

问题1:星星的数量仅与输入的数字相对应。所以如果我输入100,50,20,1,它会打印出100颗星,50颗星,20颗星和一颗星,最小的4个范围

问题2:除了未考虑的范围之外,空范围还需要像示例中那样可见

我已经考虑了一段时间,但就是找不到任何好的解决办法。我也是python新手…那么…帮帮忙

我的直方图现在是什么样子的:

Enter energy consumption data.
End by entering an empty line.

Enter energy consumption (kWh): 5
Enter energy consumption (kWh): 3
Enter energy consumption (kWh): 2
Enter energy consumption (kWh): 1
Enter energy consumption (kWh): 
      0-9: *****
    10-99: ***
  100-999: **
1000-9999: *

这就是它应该看起来的样子

Enter energy consumption data.
End by entering an empty line.

Enter energy consumption (kWh): 91
Enter energy consumption (kWh): 10
Enter energy consumption (kWh): 1001
Enter energy consumption (kWh): 5005
Enter energy consumption (kWh): 22
Enter energy consumption (kWh): 6
Enter energy consumption (kWh):
      0-9: *
    10-99: ***
  100-999: 
1000-9999: **

我的代码:

def user_input():
    list1 = []
    value = input("Enter energy consumption (kWh): ")
    while value != "":
        value = int(value)
        if value >= 0:
            list1.append(value)
        else:
            print(f"You entered: {value}. Enter non-negative numbers only!")
        value = input("Enter energy consumption (kWh): ")
    return list1



def determine_class(value):
    class_number = 1
    while True:
        if class_minimum_value(class_number) <= value <= class_maximum_value(
                class_number):
            return class_number
        class_number += 1

def class_minimum_value(class_number):
    smallest_value = 10 ** class_number // 100 * 10
    return smallest_value

def class_maximum_value(class_number):
    largest_value = 10 ** class_number - 1
    return largest_value

def class_listing(list1):
    number_of_categories = determine_class(max(list1))
    category_list = [0] * number_of_categories

    for value in list1:
        category = determine_class(value)
        category_list[category-1] += 1
    return category_list

def print_histogram(class_listing):

    for i in range(len(class_listing)):
        print_single_histogram_line(i+1, class_listing[i], len(class_listing))


def main():
    print("Enter energy consumption data.")
    print("End by entering an empty line.")
    print()

    input_data = user_input()
    if len(input_data) == 0:
        print("Nothing to print. Done.")
        return
    class_different = class_listing(input_data)
    print_histogram(input_data)


def print_single_histogram_line(class_number, count, largest_class_number):

    min_value = class_minimum_value(class_number)
    max_value = class_maximum_value(class_number)
    range_string = f"{min_value}-{max_value}"



    largest_width = 2 * largest_class_number + 1


    print(f"{range_string:>{largest_width}}: {'*' * count}")


if __name__ == "__main__":
    main()

1条回答
网友
1楼 · 发布于 2024-05-19 21:56:02

在您的代码中导航有点困难,但在我看来,您的主要问题是收集一个按需打印直方图的文件,因此只有对于该部分,您才能看到下面的代码,该代码接收项目列表(对应于您的m_input变量),将其传输到直方图,并按您的需要格式化打印:

def alternative_histogram(input_data):
    max_bucket_power = len(str(max(input_data)))
    m_histogram = {}
    for power in range(max_bucket_power):
        m_histogram[power] = len([item for item in input_data if 10**(power)-1<item<10**(power+1)])
    max_length_bucket = len(f'{10**(max_bucket_power-1)} - {10**(max_bucket_power)-1}')
    for iter, (bucket,count) in enumerate(m_histogram.items()):
        if iter == 0:
            print(f'0 - 9'.rjust(max_length_bucket) + f': {"*"*count}')
        else:
            print(f'{10**(bucket)} - {10**(bucket+1)-1}'.rjust(max_length_bucket) + f': {"*" * count}')
            
m_input1 = [1,19,942,489]
m_input2 = [1,2,3,4,5,12,13,14,15,100,101,102,1001,1002,100002]
print("histogram 1:")
alternative_histogram(m_input1)

输出:

histogram 1:
    0 - 9: *
  10 - 99: *
100 - 999: **
histogram 2:
          0 - 9: *****
        10 - 99: ****
      100 - 999: ***
    1000 - 9999: **
  10000 - 99999: 
100000 - 999999: *

正如我所期望的那样,这符合你的要求吗

编辑以对直方图打印执行rjust,以精确匹配预期输出

相关问题 更多 >