リストの内容をグリッド形式で表示するために、このコードを作成しました。アルファベットリストでは問題なく動作します。しかし、ランダムに生成されたリストで実行しようとすると、リスト インデックスが範囲外エラーになります。
完全なコードは次のとおりです: import random
#barebones 2d shell grid generator
'''
Following list is a place holder
you can add any list data to show in a grid pattern with this tool
'''
lis = ['a','b','c','d','e','f','g','h','j','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z']
newLis = []
#generates random list
def lisGen():
length = 20 # random.randint(10,20)
for i in range(length):
value = random.randint(1,9)
newLis.append(str(value))
lisGen()
askRow = input('Enter number of rows :')
askColumns = input('Enter number of columns :')
def gridGen(row,column):
j=0
cnt = int(row)
while (cnt>0):
for i in range(int(column)):
print(' '+'-',end='')
print('\n',end='')
#this is the output content loop
for i in range(int(column)):
if j<len(lis):
print('|'+newLis[j],end='')
j += 1
else:
print('|'+' ',end='')
print('|',end='')
print('\n',end='')
cnt -= 1
for i in range(int(column)):
print(' '+'-',end='')
print('\n',end='')
gridGen(askRow,askColumns)
アルファベットリスト (lis) を使用した、期待される/正しい出力:
Enter number of rows :7
Enter number of columns :7
- - - - - - -
|a|b|c|d|e|f|g|
- - - - - - -
|h|j|i|j|k|l|m|
- - - - - - -
|n|o|p|q|r|s|t|
- - - - - - -
|u|v|w|x|y|z| |
- - - - - - -
| | | | | | | |
- - - - - - -
| | | | | | | |
- - - - - - -
| | | | | | | |
- - - - - - -
ランダムに生成されたリスト ( newLis ) を使用した場合のエラー出力:
Enter number of rows :7
Enter number of columns :7
- - - - - - -
|9|2|1|4|7|5|4|
- - - - - - -
|9|7|7|3|2|1|3|
- - - - - - -
|7|5|4|1|2|3Traceback (most recent call last):
File "D:\01-Mywares\python\2d shell graphics\gridGen.py", line 56, in <module>
gridGen(askRow,askColumns)
File "D:\01-Mywares\python\2d shell graphics\gridGen.py", line 40, in gridGen
print('|'+newLis[j],end='')
IndexError: list index out of range
あなたのgridGen
関数はインデックスを作成してnewLis
いますが、lis
代わりに のサイズをテストしていますnewLis
。gridGen
グローバルにアクセスするのではなく、印刷するリストを渡す方がはるかに優れた設計になりますnewLis
。そうすれば、コードが読みやすくなり、そのような間違いをする可能性が低くなります。同様に、lisGen
global を変更するのではなく、ローカル リストを作成してそれを返す必要がありますnewLis
。
あなたgridGen
は必要以上に複雑です。出力したいリストのイテレータを作成し、そのイテレータでnext
関数を呼び出すことで単純化できます。私たちは、与えるnext
のデフォルト引数' '
リストは、項目を使い果たしそうする場合、単一の空白文字を含む文字列を-next
空白を返します。
文字列を 1 つずつ出力するのではなく、リスト内包表記の各行を作成し、行内の文字列を 1 つの文字列に結合します。
これがあなたのプログラムの私のバージョンです。PEP-8 スタイル ガイドに準拠するように名前を変更しました。
import random
random.seed(42)
def lis_gen():
newlis = []
length = 20
for i in range(length):
value = random.randint(1,9)
newlis.append(str(value))
return newlis
def grid_gen(lis, rows, cols):
it = iter(lis)
# Horizontal line
hline = ' -' * cols
print(hline)
for j in range(rows):
line = '|'.join([next(it, ' ') for i in range(cols)])
print('|' + line + '|')
print(hline)
ask_rows = 5
ask_cols = 7
alpha = list('abcdefghijklmnopqrstuvwxyz')
grid_gen(alpha, ask_rows, ask_cols)
print()
newlis = lis_gen()
grid_gen(newlis, ask_rows, ask_cols)
出力
- - - - - - -
|a|b|c|d|e|f|g|
- - - - - - -
|h|i|j|k|l|m|n|
- - - - - - -
|o|p|q|r|s|t|u|
- - - - - - -
|v|w|x|y|z| | |
- - - - - - -
| | | | | | | |
- - - - - - -
- - - - - - -
|2|1|5|4|4|3|2|
- - - - - - -
|9|2|7|1|1|2|4|
- - - - - - -
|4|9|1|9|4|9| |
- - - - - - -
| | | | | | | |
- - - - - - -
| | | | | | | |
- - - - - - -
ここで実際に行う必要はないことに注意してください。リストの代わりに文字列alpha = list('abcdefghijklmnopqrstuvwxyz')
を渡すとgrid_gen
、文字列内の各文字を反復処理します。
に改善の余地ありgrid_gen
。もう少し作業をすれば、複数の文字を含む文字列をきれいに出力できます。最初のステップは、入力リストをスキャンして、それに含まれる最も長い文字列の長さを見つけることです。lis
が文字列のリストである場合、それを行うことができます
maxlen = max(map(len, lis))
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加