2016-04-17 6 views
-6

3つのテキストファイルに18個のリストアイテムを追加しようとしていますが、それぞれに6個のアイテムが追加されています。 paths[0]paths[1]のテキストファイルは正しいですが、3番目のpaths[2]は3つの項目しか取得しません。Python:リストの索引が範囲外ですが、リストに項目がありますか?

mainStudents = ["1 Name Surname D1", "2 Name Surname D2" ...16x] 
def randomize(path): 
    count = 0 
    currentpathIs = getprojdir + "\\" + "\shuffled" + path 
    print(currentpathIs) 
    with open(currentpathIs, "a+") as file: 
     while True: 
      try: 
       file.write(mainStudents[count] + "\n") 
       del(mainStudents[count]) 
       print(count) 
       count += 1 
      except Exception as e: 

       print(mainStudents) 
       break 
      if count == 6: 
       break 

randomize(paths[0]) 
randomize(paths[1]) 
randomize(paths[2]) 

私はこのエラーになっています:

Traceback (most recent call last):

File "C:\Users\user\Desktop\New folder\python.py", line 53, in randomize(paths[2])

File "C:\Users\user\Desktop\New folder\python.py", line 43, in randomize file.write(mainStudents[count] + "\n")

IndexError: list index out of range

をしかしmainStudentsリストに残った3つの項目がありますか?

+2

ここで 'mainStudents'はどのように初期化されますか? – idjaw

+0

'mainStudents'はグローバルですか? –

+0

'mainStudents'の値は何ですか? – youngminz

答えて

1

あなたが持っている問題は、あなたがあなたのリストから項目を削除するとき、あなたはそのサイズを小さくしていることです。したがって、あなたのカウントは増加し、次に存在しなくなったインデックスにアクセスしようとします。ジャストサイズ2のリストを持つのは非常に簡単な例を見てみましょう:

mainStudents = ["1 Name Surname D1", "2 Name Surname D2"] 

今、あなたのメソッドを呼び出すときに、起こるために何が起こっているか、最初の反復は動作しますが、あなたはmainStudents[0]にアクセスするため。今、それは希望のためにサイズ1、およびインデックス・アクセスのリストである

['2 Name Surname D2'] 

:あなたの2回目の繰り返しで、あなたが今、あなたのリストのように見える、リストからその項目を削除した

しかし、 0となります。

だから、あなたのwhileループの次の反復は1countを持つことになります。したがって、正確にあなたのIndexErrorが来ている場所です。

whileループとdelのリストを使用することを決定する組み合わせが問題を引き起こしています。代わりに、正確に繰り返したいものを選んでください。論理からはmainStudentsのように見えます。だから代わりにそれをするのはなぜですか?

def randomize(path): 
    currentpathIs = getprojdir + "\\" + "\shuffled" + path 
    print(currentpathIs) 
    with open(currentpathIs, "a+") as file: 
     for student in mainStudents: 
      file.write(student + "\n") 

そして、あなたはさらに、単にあなたのリストを取り、利用できる文字列の方法、joinを使用して\nで区切られた文字列に変換することによりすることを簡素化することができます:

'\n'.join(mainStudents) 

また、に利用可能な方法がありますパスの作成を容易にします。 osモジュールを見てください。より具体的にはos.path.join。したがって、コードをさらに簡素化することができます:

from os.path import join 

def randomize(path): 
    currentpathIs = join(getprojdir, shuffled, path) 
    with open(currentpathIs, "a+") as file: 
     file.write('\n'.join(mainStudents)) 
関連する問題