2015-03-19 2 views
0

Я разработал этот код ниже, который в основном принимает в качестве ввода, количество строк, столбцов, наибольшее значение и самое низкое значение от пользователя.Создание диаграммы на Python

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 

Любые предложения/идеи о том, как я могу получить свой вывод, похожи на тот, который вам нужен?

+0

[Этот вопрос] (http://stackoverflow.com/questions/13214809/pretty-print-2d-python-list) может вам помочь. – KSFT

+0

И [этот вопрос] (http://stackoverflow.com/questions/9989334/create-nice-column-output-in-python) –

+0

Хотя у одного связанного @KSFT есть удивительный пример с жидким камамбертом. : D –

ответ

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="") 

Я предполагаю, что вы используете Python 3 на основе круглых скобок, которые вы используете с вашим утверждением печати, поэтому я воспользовавшись этим в последней строке, но я обычно использую Python 2, поэтому дайте мне знать, если я что-то испортил.