2016-09-16 8 views
0
def gen(filename): 
    result=[] 
    with open(filename) as sample: 
     for line in sample.read().splitlines(): 
      for ch in line.split():     
       result.append(ch) 
       yield ch 
return result 

「ABCDEF」を渡すと、「 "A"、 "B"」の代わりに["ABCDEF" "C"、 "D"、 "E"、 "F"]リストに新しい項目を追加するのではなく、最初のリスト項目に内容を追加します。

何が問題なのですか?

また、発電機を正しく使用していますか?そうでなければ、何が間違っているのですか?私が概念を把握に近いですが、私はかなりそこはまだないですし、リストを追加することが

EDIT逆発電機を作るかもしれないと感じて:

with filled_filename("ABCDEF") as fn: 
     self.assertEqual(list(project.gen(f)), ["A","B","C","D","E","F"]) 
     print(list(project.gen(ff))) 
+0

"カンマを追加する"かどうかは問題ではなく、リストに追加するか、リストの最初の要素である文字列に追加するかは問題です。 –

+0

カンマは、リストを表示するために使用される構文に過ぎません。実際には内容としてコンテンツに含まれません。 –

+0

と言っていますが、明白な答えは、 'for ch in line.split()'ではなく 'for ch in line'を使うことです。 'split()'は空白を分割し、あなたの行は空白を持ちません。 –

答えて

1

I:ここで私は、ファイルを開いています方法ですこれは、あなたが欲しいものだと思う:

def gen(filename): 
    with open(filename) as sample: 
     for line in sample.read().splitlines(): 
      for ch in line: 
       yield ch 

# Example usage: 
for ch in gen('myfile.txt'): 
    print("Got character '{}'.".format(ch)) 

あなたが言ったように、list並べ替えの構築しているが、発電機の冗長化を行います。 (あなたはyieldに行くごとに1文字ずつ入力しますが、これまでに見たことのない完全パターンのlistも返されます)

あなたのコードは、私はあなたが個々の文字に行を分割したいと思うことですが、line.split()はそれをしません。ちょうどfor ch in lineを使用してください。近いあなたのコードをどこかに取得しよう

EDIT

このコードは動作し、アサートを渡し
def gen(filename): 
    with open(filename) as sample: 
     for line in sample: 
      line = line.rstrip() 
      for ch in line: 
       yield ch 

def filled_filename(text): 
    with open('test.txt', 'wb') as f: 
     f.write(text) 
    return 'test.txt' 

filename = filled_filename(b'ABCDEF') 
assert list(gen(filename)) == ['A', 'B', 'C', 'D', 'E', 'F'] 

+0

私の先生はテストケースを使用しています。そして、それは私がそれらのテストケースで得ている出力です –

+0

@ Team.Coco質問をしたり、何かを明確にしたり、自分の答えがあなたのために働いたり、そうでないと言っているかどうかはわかりません。 :-)私のコードはあなたが望むことをしますか? – smarx

+0

何らかの理由でジェネレータが何も返さないため、実装されていないエラーが発生しました –

関連する問題