2017-04-26 9 views
1

グリッド形式でリストの内容を表示するためにこのコードを書きました。 アルファベットリストには問題ありません。 しかし、ランダムに生成されたリストでそれを実行しようとすると、範囲外のエラーのリストインデックスが返されます。 インポートランダムPythonプロジェクトで作業中に、エラー:リストの索引が範囲外になっています。

#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 
+0

であなたは'もしJ

+0

ああ、私はそれを逃した、助けてくれてよかった。 – USBEN

答えて

0

あなたgridGen機能がnewLisにインデックス付けされたが、それはlis代わりのnewLisの大きさをテストしています。 gridGenに、newLisにアクセスするのではなく、印刷したいリストを渡すと、はるかに優れたデザインになります。そうすれば、コードを読みやすくなり、そのような間違いをする確率を減らすことができます。同様に、lisGenは、グローバルnewLisを変更するのではなく、ローカルリストを作成して返す必要があります。

gridGenは、必要以上に複雑です。印刷したいリストのイテレーターを作成し、そのイテレーターでnext関数を呼び出すことで、単純化することができます。 nextにはデフォルトの引数' 'が与えられます.1つの空白文字を含む文字列であるため、リスト内で項目がなくなると、nextは空白を返します。

文字列を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) 

出力私たちは本当にここalpha = list('abcdefghijklmnopqrstuvwxyz')を行う必要はありません

- - - - - - - 
|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| | 
- - - - - - - 
| | | | | | | | 
- - - - - - - 
| | | | | | | | 
- - - - - - - 

注:我々はそれが文字列の各文字を反復しますリストの代わりに文字列をgrid_gen渡す場合。


grid_genには改善の余地があります。もう少し作業すれば、複数の文字を含む文字列をきれいに印刷することができます。最初のステップでは、入力リストをスキャンして、入力リストに含まれる最長文字列の長さを検索します。`しかし、それはあなたがいるので、` IndexError`を取得している何の驚きではありませんので、 `newLis`にアクセス:lisは文字列のリストであるならば、我々は

maxlen = max(map(len, lis)) 
+0

私のコードには大きな説明と改善がありました。これに本当に感謝しています:D。そのラインメソッドは素晴らしいですし、あなたのmaxlenメソッドを使ってそれを行い、複数桁の出力を試みる予定のgrid_len改善について話しています。 – USBEN

0

lisGen関数の問題は、リストの固定数(つまり、あなたの場合は20)。それは行*列でなければなりません。

This is the link for updated code

+0

この問題を修正しました:D、ありがとうございました。 – USBEN

関連する問題