1

このグラフを横ではなく縦に印刷するにはどうすればよいですか? 変更を理解できるように、コードで使用したのと同じ概念 (ループ、リスト) を使用してみてください。ご協力ありがとうございました!

コードは次のとおりです。

SIGN='x'

test_list=[500000,5000000,7000000]
test_calc_list=[]
test_sum=sum(test_list)

test_string_list=['Test1','Test2','Test3']
signs_list=[]

for x in test_list:
    test_calc=round((x/float(test_sum)*10))
    test_calc_list.append(test_calc)

for y in test_calc_list:
    y=int(y)
    signs=y*SIGN
    signs_list.append(signs)

for z in range(len(test_string_list)):
    print "%8s: %-6s %7i"% (test_string_list[z],signs_list[z],test_list[z])

これは私が得る出力です:

Test1:           500000
Test2: xxxx     5000000
Test3: xxxxxx   7000000

これは私が望む出力です:

                      x
           x          x
           x          x
           x          x
           x          x
Test1      Test2      Test3        
500000     5000000    7000000
4

1 に答える 1

1

これが宿題ではないと仮定すると (剽窃を検出するソフトウェアがあることをご存知ですか?)、考えられる解決策を次に示します。

最も簡単なのは、リストが固定サイズであると仮定することです。

for i in range(len(max(signs_list)), 0, -1):
    print ('{0:<8} {1:<8} {2}').format(
        'x' if len(signs_list[0]) >= i else '', 
        'x' if len(signs_list[1]) >= i else '', 
        'x' if len(signs_list[2]) >= i else '')
print ('{0:<8} {1:<8} {2}').format(test_string_list[0], test_string_list[1], test_string_list[2])
print ('{0:<8} {1:<8} {2}').format(test_list[0], test_list[1], test_list[2])

トリッキーなのは、必要な任意のサイズのリストを処理することですeval

for i in range(len(max(signs_list)), 0, -1):
    template_string = ""
    input_string = ""
    for z in range(len(test_string_list)):
        string_part = "{" + str(z) + ":<8} "
        template_string += string_part
        input_part = "'x' if len(signs_list[" \
            + str(z) + "]) >= i else '',"
        input_string += input_part
    statement = "('" + template_string + "')"
    statement += ".format"
    statement += "(" + input_string[:-1] + ")"
    print eval(statement)

template_string = ""
input_string = ""
for z in range(len(test_string_list)):
    string_part = "{" + str(z) + ":<8} "
    template_string += string_part
    input_part = "test_list[" + str(z) + "],"
    input_string += input_part
statement = "('" + template_string + "')"
statement += ".format"
statement += "(" + input_string[:-1] + ")"
print eval(statement)

template_string = ""
input_string = ""
for z in range(len(test_string_list)):
    string_part = "{" + str(z) + ":<8} "
    template_string += string_part
    input_part = "test_string_list[" + str(z) + "],"
    input_string += input_part
statement = "('" + template_string + "')"
statement += ".format"
statement += "(" + input_string[:-1] + ")"
print eval(statement)

上記の怪物は、ステートメントの構造を削除するためにリファクタリングできます。

def statement_constructor(list_type, list_size):
    template_string = ""
    input_string = ""
    for z in range(list_size):
        string_part = "{" + str(z) + ":<8} "
        template_string += string_part
        if list_type == "signs_list":
            input_part = "'x' if len(signs_list[" \
                + str(z) + "]) >= i else '',"
        else:
            input_part = list_type + "[" + str(z) + "],"
        input_string += input_part
    statement = "('" + template_string + "')"
    statement += ".format"
    statement += "(" + input_string[:-1] + ")" 
    return statement

length = len(test_string_list)
for i in range(len(max(signs_list)), 0, -1):
    print eval(statement_constructor('signs_list', length))
print eval(statement_constructor('test_list', length))
print eval(statement_constructor('test_string_list', length))

3 つすべてが同じ出力を生成します。

                  x        
                  x        
         x        x        
         x        x        
         x        x        
         x        x        
500000   5000000  7000000  
Test1    Test2    Test3 

使用するソリューションevalは Test4、Test5 などを処理できますが。もっとエレガントな解決策があるかもしれませんが、これは機能します。

編集: または、evalMichael0x2a のコメントで提案されたやり過ぎのないよりエレガントなソリューション。

def statement_constructor(list_type, list_size):
    template_string = ""
    input_string = ""
    array = []
    for z in range(list_size):
        string_part = "{:<8}"
        template_string += string_part
        if list_type == "signs_list":
            array.append('x' if len(signs_list[z]) >= i else '')
        elif list_type == 'test_list':
            array.append(test_list[z])
        else:
            array.append(test_string_list[z])
    print (template_string).format(*array)


length = len(test_string_list)
for i in range(len(max(signs_list)), 0, -1):
    statement_constructor('signs_list', length)
statement_constructor('test_list', length)
statement_constructor('test_string_list', length) 
于 2013-04-20T07:23:37.607 に答える