2016-11-06 16 views
2

基本的には、各行の各文字をリストに読み込み、各行の後にそのリストは別のリストにリストされています(入力ファイルの各行に1つのリストがあり、各行には各行のすべての文字がすべてリストされています)入力ファイルの行の各文字をリストに追加し、各行の後にリストを別のリストに追加する

これは私がこれまで行ってきたことですが、なぜ。

allseq = [] 
with open("input.txt", "r") as ins: 
    seq = [] 
    for line in ins: 
     for ch in line: 
      if ins != "\n": 
       seq.append(ch) 
      else: 
       allseq.append(seq) 
       seq[:] = [] 

print(allseq) 

答えて

2

文字列は文字のリテラルリストに簡単に変換できます。機能を作ろう。

def get_char_lists(file): 
    with open(file) as f: 
     return [list(line.strip()) for line in f.readlines()] 

これは、読書のためのファイルを開くすべての行を読み込み、リストに文字のリストを貼り、その最後のリストを返します、余分な空白を取り除き。

+0

ありがとうございました!これはもっと洗練されたソリューションです。 – Matt

+0

@Matt、問題ありません!どこかで始まらなければならない! :) –

1

簡単な方法(@Pierceの回答)があるにもかかわらず、元のコードには2つの問題があります。第二は理解することが重要です。

allseq = [] 
with open("input.txt", "r") as ins: 
    seq = [] 
    for line in ins: 
     for ch in line: 
      if ch != "\n":   # Use ch instead of ins here. 
       seq.append(ch) 
      else: 
       allseq.append(seq) 
       seq = []   # Don't clear the existing list, start a new one. 

print(allseq) 

テストファイル:

this is 
some input 

出力:第2回修正が必要な理由

[['t', 'h', 'i', 's', ' ', 'i', 's'], ['s', 'o', 'm', 'e', ' ', 'i', 'n', 'p', 'u', 't']] 

明確にするために、あなたがリストにオブジェクトを追加する場合、オブジェクトへの参照があるとリストに配置されます。そのオブジェクトを後で変更すると、同じオブジェクトを参照するため、リストの表示内容が変更されます。 seq[:] = []は元のリストを空に変更します。

>>> allseq = [] 
>>> seq = [1,2,3] 
>>> allseq.append(seq) 
>>> allseq    # allseq contains seq 
[[1, 2, 3]] 
>>> seq[:] = []   # seq is mutated to be empty 
>>> allseq    # since allseq has a reference to seq, it changes too. 
[[]] 
>>> seq.append(1)   # change seq again 
>>> allseq    # allseq's reference to seq displays the same thing. 
[[1]] 
>>> allseq.append(seq) # Add another reference to the same list 
>>> allseq     
[[1], [1]] 
>>> seq[:]=[]    # Clearing the list shows both references cleared. 
>>> allseq 
[[], []] 

あなたはallseqがid()で、配列に同じ参照番号が含まれて見ることができます:

>>> id(seq) 
46805256 
>>> id(allseq[0]) 
46805256 
>>> id(allseq[1]) 
46805256 

seq = []ではなく、同じリストを変異の、異なるIDを持つ新しいリストを作成します。

+0

私は彼がどこに間違っていたかを指摘すべきだった。それを記入してくれてありがとう!彼の目標を達成するためのより良い方法を学ぶことに加えて、彼のミスから学ぶことがOPにとっては間違いなく役に立ちます。 –

0

あなた、または他の誰が、1つのライナーを好む場合は、ここでは(ピアースDarraghの優れた回答に基づいて)です:

allseq = [list(line.strip()) for line in open("input.txt").readlines()] 
関連する問題