作为一个新手程序员试图创建一个简单的模块来打印直方图。(###用于打印直方图,因为我不熟悉使用utf-8代码 这是程序
这个porgam作为一个示例列表采用36个哈希但不创建4柱直方图
这个程序的想法是程序按元素读取list-x元素,如果element等于list max value,它打印一个hash,将max值减1,所有元素都等于max value。如果列表元素小于最大值,则打印空白。随着迭代在某个时间进行,越来越多的元素将打印哈希以创建直方图,并且当所有列表元素为零时处理终止,并且此时打印列表元素标签。 如何修改程序以打印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)
答案 0 :(得分:0)
我不完全确定你要完成什么。但是我假设你正试图用一些ascii表示一个histrogram。
您可以将输入(整数列表)转换为长度与列表中每个值匹配的字符串列表:
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
来强制进行评估。
答案 1 :(得分:0)
根据要求,这里有一个看起来像原始解决方案的答案 - 只需修改以提供正确的结果。
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 "
答案 2 :(得分:0)
这符合您减少每次迭代的最大值的想法。
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