【问题标题】:Simple module for creating histogram用于创建直方图的简单模块
【发布时间】:2014-11-26 19:33:15
【问题描述】:

作为一个新手程序员,试图创建一个简单的模块来打印直方图。(### 用于打印直方图,因为我不熟悉使用 utf-8 代码 这是程序

此 porgam 作为示例列表采用 36 个哈希值,但未创建 4 柱直方图

这个程序的想法是程序逐个元素地读取 list-x 元素,如果元素等于列表最大值,它会打印一个哈希,将最大值减 1,并且所有元素都等于最大值。如果列表元素小于最大值,则打印空白。随着迭代在某个时间进行,越来越多的元素将打印散列以创建直方图,并且当所有列表元素都为零并且此时打印列表元素标签时进程终止。 如何修改程序以打印 4 柱直方图或 n 柱直方图,其中 n 是列表长度

def histogram(x):


    while x!=[0]*len(x):
       for i in range(len(x)):
           y=max(x)

           if x[i]==y:
               print("###"),
               y-=1
               x[i]-=1


           if x[i]<y:
               print("   "),

           if x==[0]*len(x):
               print "  A  ","  B  " ,"  C ","  D "




x=[10,2,12,22]
print histogram(x)

【问题讨论】:

    标签: python histogram


    【解决方案1】:

    我不完全确定您要完成什么。但我假设您正在尝试对直方图进行一些 ascii 表示。

    您可以将您的输入(整数列表)转换为长度与列表中每个值匹配的字符串列表,其中包含列表理解:

    hist = (x*'#' for x in input)
    

    最长的字符串将由下式给出

    m = max(input)
    

    你可以用它来填充字符串:

    histPadded = (x.rjust(m, " ") for x in hist)
    

    然后转置:

    flipped = flipped = zip(*list(histPadded))
    

    然后就可以打印出来了:

    list(map(lambda x: print("".join(map(str, x))), flipped))
    

    需要外部list 来强制评估。

    【讨论】:

    • 谢谢。但是会感谢回复,为什么我的版本没有按照例如列表中的 4 个整洁的柱子打印。如何使程序遍历列表并在新行中打印每次迭代以获取历史记录
    • 可能有很多原因。我认为您应该重新考虑解决方案的整体结构。尝试将问题分解为更小的问题。无论如何。我已经提交了一个与你类似的解决方案,也许你可以自己看看你做错了什么。
    【解决方案2】:

    根据要求,这里提供了一个看起来像原始解决方案的答案 - 只是经过修改以提供正确的结果。

    def histogram(x):
        y=max(x)
        while x!=[0]*len(x):
            for i in range(len(x)):
                if x[i]==y:
                    print("###"),
                    x[i]-=1
                elif x[i]<y:
                    print("   "),
            print("")
            y-=1
        print " A   B   C   D "
    

    【讨论】:

      【解决方案3】:

      这遵循了您减少每次迭代的最大值的想法。

      def h(x):
          mx =max(x)
          lx = len(x)
          m = []
          for v in x :
              # reduces max value by 1 in each ieration
              #                    VVVVVV
              m.append(["   "if v < mx-n else "***" for n in range(l)])
              #                    ^^^^^^
          return "\n".join(["  ".join(t) for t in zip(*m)]+
                           ["  ".join([" A "," B "," C "," D "," E ", " F "][:lx])])
      

      测试

      x=[10,2,12,11]
      print h(x)
      

      输出

                ***     
                ***  ***
      ***       ***  ***
      ***       ***  ***
      ***       ***  ***
      ***       ***  ***
      ***       ***  ***
      ***       ***  ***
      ***       ***  ***
      ***       ***  ***
      ***  ***  ***  ***
      ***  ***  ***  ***
       A    B    C    D 
      

      【讨论】:

        猜你喜欢
        • 2010-11-04
        • 1970-01-01
        • 1970-01-01
        • 2011-06-14
        • 2014-08-23
        • 2018-05-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多