これが宿題ではないと仮定すると (剽窃を検出するソフトウェアがあることをご存知ですか?)、考えられる解決策を次に示します。
最も簡単なのは、リストが固定サイズであると仮定することです。
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 などを処理できますが。もっとエレガントな解決策があるかもしれませんが、これは機能します。
編集: または、eval
Michael0x2a のコメントで提案されたやり過ぎのないよりエレガントなソリューション。
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)