2016-04-13 13 views
0

ich den folgenden CodeLooping die Zeichen einer Zeile jedes zu erhalten, aber mit Indexerror: string Index außerhalb des zulässigen Bereichs

import sys 

from collections import defaultdict 

filename = sys.argv[1] 

g = defaultdict(list) 

l = 0 

with open(filename) as graph_file: 
    for line in graph_file: 
     for pos in line: 
      g[l].append(pos[0]) 
      g[l].append(pos[1]) 

      g[l+1].append(pos[1]) 
      g[l+1].append(pos[2]) 

     l = l+1 

for i in g.keys(): 
    if '\n' in g[i]: 
     g[i].remove('\n') 

for i in g.keys(): 
    print (i, g[i]) 

Wenn ich das cmd verwenden, das Programm auszuführen, habe ich die folgende Fehlermeldung und Ich kann nicht verstehen warum.

Traceback (letzter Anruf zuletzt): File "test.py", Zeile 15, in g [L] .append (po [1]) Indexerror: string-Index außerhalb des Bereichs

I Ich weiß, was es bedeutet, aber ich kann nicht verstehen, warum es passiert. Die Textdatei, die ich versuche das zu öffnen, folgende:

ATA 
GTG 
TAC 
ACC 
AAG 
CCA 
TGG 
GTA 
TAT 
ATG 
TGT 
AGT 
GGA 
GAC 
ACT 
CTT 
TTC 
CAA 
TCA 
CAT 
+0

Was die Ausgabe von 'Druck pos' ist. Sieht so aus, als ob deine erste Zeile ein Leerzeichen oder etwas ist. – Bahrom

+0

Ich werde vorschlagen, einen Debugger wie das Debugger-Tool von PyCharm zu verwenden. Erfahren Sie, wie Sie mit dem Programm debuggen können, um zu verstehen, wo Ihr Problem liegt und um eine Lösung zu finden. – Rafael

Antwort

2

Ihr Problem ist, dass, wenn Sie eine Schleife über mit for pos in line, Sie Looping im wesentlichen über for pos in 'ATA', die erste Zeile nehmen. Daher wird pos zuerst 'A' zugewiesen, wodurch ein Fehler ausgelöst wird, wenn Sie versuchen, auf das zweite Element in diesem Objekt zuzugreifen - Sie durchlaufen einmal zu viele Schleifen.

Stattdessen Ihr Code wie folgt ändern:

import sys 

from collections import defaultdict 

filename = sys.argv[1] 

g = defaultdict(list) 

l = 0 

with open(filename) as graph_file: 
    for line in graph_file: 
     g[l].append(line[0]) 
     g[l].append(line[1]) 
     g[l+1].append(line[1]) 
     g[l+1].append(line[2]) 

     l = l+1 

for i in g.keys(): 
    if '\n' in g[i]: 
     g[i].remove('\n') 

for i in g.keys(): 
    print (i, g[i]) 

bash-3.2$ python foo.py foo.txt 
(0, ['A', 'T']) 
(1, ['T', 'A', 'G', 'T']) 
(2, ['T', 'G', 'T', 'A']) 
(3, ['A', 'C', 'A', 'C']) 
(4, ['C', 'C', 'A', 'A']) 
(5, ['A', 'G', 'C', 'C']) 
(6, ['C', 'A', 'T', 'G']) 
(7, ['G', 'G', 'G', 'T']) 
(8, ['T', 'A', 'T', 'A']) 
(9, ['A', 'T', 'A', 'T']) 
(10, ['T', 'G', 'T', 'G']) 
(11, ['G', 'T', 'A', 'G']) 
(12, ['G', 'T', 'G', 'G']) 
(13, ['G', 'A', 'G', 'A']) 
(14, ['A', 'C', 'A', 'C']) 
(15, ['C', 'T', 'C', 'T']) 
(16, ['T', 'T', 'T', 'T']) 
(17, ['T', 'C', 'C', 'A']) 
(18, ['A', 'A', 'T', 'C']) 
(19, ['C', 'A', 'C', 'A']) 
(20, ['A', 'T']) 
bash-3.2$ 
+0

Vielen Dank Ich denke, ich habe was du meinst :) Immer noch, wenn ich das Programm jetzt ausführen, bekomme ich einen neuen Fehler und ich denke, es hat mit der Art zu tun, wie ich die Datei lese oder öffne, aber ich weiß nicht gow um es zu beheben ..: NameError: Name 'ATA' ist nicht definiert ATA ist die erste Zeile meiner TXT-Datei –