Python图表创建

时间:2015-03-19 00:28:12

标签: python list

我在下面设计了这个代码,它基本上用作输入,用户的行数,列数,最高值和最低值。

import random
import math


nrows=int(input("enter the number of rows: "))
ncols=int(input("enter the number of columns: "))
lowval=float(input("enter the lowest value: "))
highval=float(input("enter the highest value: "))

def list(nrows, ncols, lowval, highval):
    values=[[0, 0, 0, 0],[0, 0, 0, 0],[0, 0, 0, 0]]

    for r in range(nrows):
        for c in range(ncols):
            values[r][c] = random.uniform(lowval,highval+1)

    print(values)


list(nrows, ncols, lowval, highval)

现在,我正在努力的领域是尝试获取列表并将其转换为类似于图表的更有条理的东西,以便输出基本上反映了这一点,例如:

Number of rows: 4
Number of columns: 3
Low value: -100
High value: 100

             0         1         2
   0     7.715     6.522    23.359
   1    79.955    -4.858   -71.112
   2    49.249   -17.001    22.338
   3    98.593   -28.473   -92.926

关于如何使我的输出看起来像上面所需的任何建议/想法?

1 个答案:

答案 0 :(得分:0)

我不知道我在评论(here)中链接的代码是如何工作的,所以我会尝试更清楚地编写代码。

import string

在您给出的示例中,列之间有不同的空间。看起来您可以使每列具有相同的固定宽度,或者使它们成为该列中最长字符串的宽度加上一些常量的间距。那个常数的三个或四个看起来不错:

def formatchart(data,spacing=3):

我会使用zip()splat operator来转置数据,以便我可以处理列,因为这是间距的基础。我可以稍后将其转置回来进行打印。

    t = zip(*data)

我会迭代这些行以确定每个行的宽度。我正在使用range(len(t)),因为我将在此循环中填充它们,因此我需要索引来修改t

    for i in range(len(t)):

我使用list comprehension来迭代行中的项目,找到max,然后添加额外的间距。

        width = max([len(j) for j in t[i]])+spacing

现在,我将用空格填充行中的每个字符串。我使用rjust(),但如果你愿意,你可以很容易地左对齐,或者甚至有一些左对齐和一些右对齐。

        t[i] = [string.rjust(j,width) for j in t[i]]

现在,我只需要再次转置并打印出来:

    formatted = zip(*t)
    for i in formatted:
        for j in i:
            print(j,end="")

我假设你基于你在print语句中使用的括号使用Python 3,所以我在最后一行中利用了它,但我通常使用Python 2,所以让我知道如果我弄乱了什么。