1

次のような .txt ファイルから食料品リストの関数を作成する必要があります。

milk
cheese

bread
hotdog buns

chicken
tuna
burgers

等々。上記のリストから、私の食料品リストは次のよう[['milk', 'cheese'], ['bread', 'hotdog buns'], ['chicken', 'tuna', 'burgers']]になるはずです。つまり、テキスト ファイル内でアイテム間にスペースがある場合、アイテムが区切られているリストのリストです。

を使用する必要がありますが、 、またはループ.readline()は使用できません。私のコードは今空のリストを作成します:.readlines(), .read()for

def grocery_list(foods):
    L = open(foods, 'r')
    food = []
    sublist = []
    while L.readline() != '':
        if L.readline() != '\n':
            sublist.append(L.readline().rstrip('\n'))
        elif L.readline() == '\n':
            food.append(sublist)
            sublist = []
    return food

どこが間違っているのかわからないので、完全に空のリストを返します。''and'\n'の部分についてもわかりません。私が使用しているテスト ファイルの例をシェルで開くと、次のようになります。

milk\n
cheese\n
\n
...
''
''

しかし、すべてのリストについて.rstrip()、または全体が意味をなすのでしょうか? != ''それとも、私は正しい軌道に乗っていないだけですか?

4

4 に答える 4

4

1 つの問題は、最終sublist結果を結果に追加していないことです。@Xymostech が述べたようにreadline()、次の呼び出しは異なるため、各呼び出しの結果をキャプチャする必要があります。コードを変更する方法は次のとおりです。

def grocery_list(foods):
    with open(foods, 'r') as L:        
        food = []            
        sublist = []            

        while True:
            line = L.readline()
            if len(line) == 0:
                break

            #remove the trailing \n or \r
            line = line.rstrip()

            if len(line) == 0:
                food.append(sublist)
                sublist = []                    
            else:
                sublist.append(line)
        if len(sublist) > 0:
            food.append(sublist)

        return food

withステートメントの使用に注意してください。これにより、不要になったファイルが確実に閉じられます。

于 2012-11-13T05:11:02.940 に答える
2

私の意見では、少しすっきりしています。必要な結果を達成するための別のオプション。

def grocerylist(foods):  
  with open(foods) as f:
    line = f.readline()
    items = []
    while line:
      items.append(line.rstrip())
      line = f.readline()
    newlist = [[]]
    for item in a:
      if not x: newlist.append([])
      else: newlist[-1].append(x)
    return newlist

newlist現在、次のものが含まれています。

[['milk', 'cheese'], ['bread', 'hotdog buns'], ['chicken', 'tuna', 'burgers']]
于 2012-11-13T06:19:08.507 に答える
2

あなたが望むものを達成するために、私は以下のようにあなたのコードを修正しました:

def grocery_list(foods):
    with open(foods,'r') as f:
        food=[]
        sublist=[]
        while True:
            line=f.readline()
            if len(line)==0:
                break
            if line !='\n':
                sublist.append(line.strip())
            else:
                food.append(sublist)
                sublist=[]
        food.append(sublist)
    return food
于 2012-11-13T06:11:44.167 に答える
1

L.readline() を呼び出すたびに、別の行を読み込んでいます。最初にその値を保存し、次の各ステートメントでその値を使用する必要があります。

于 2012-11-13T05:05:34.890 に答える