2016-10-06 6 views
0

Pythonのリストについての経験はあまりありません。だから、基本的に、私は1つの巨大なリストの中にNのリストを作成したい。このようなファイルからの読み込み:リストの一覧ですが、Pythonの特定の表現

Fail = h yes 
Sucess = h no 

これは、ファイル内の2行の例であり、ファイルはN行が含まれ、したがって、私はそれがあるべきような行ごとにリストを作成します:

List of list = [ 
     ["Fail", ("h", "yes")], 
     ["Sucess", ("h", "no")]],] 

の行の場合には:

:1つの出力だけで

Fail = h 

、そのリストには次のようにする必要があります

私のコードは今,:

with open('file.txt') as f: 
    for l in f: 
     l_rule = l.split() 
     # print(l_rule) 
     G_list.append(l_rule[0]) 
     length= len(l_rule) 
     if length == 3: 

       m = "(" + l_rule[2]+ "," +")" 
       G_list.append(m) 


     else: 


       m = "(" + l_rule[2]+","+l_rule[3] +")" 
       G_list.append(m) 

     print(G_list) 
     listoflist.append(G_list) 

print(listoflist) 

のために動作しません。そして、私は上記で説明したように、それは私が必要なものを返しません。私は助けに感謝します。

あなたはタプルを作成する文字列関数を使用することはできません
+0

'[" Fail "、(" h "、))、]'は構文上無効です。私はあなたが '["失敗 "、(" h "、)]'を意味すると仮定します。 – TigerhawkT3

答えて

1

- ("h", "yes")

はあなたが必要

m = (l_rule[2],) 

m = (l_rule[2], l_rule[3]) 

編集:私はあなたが新しい要素

を追加する前にG_listをクリアする必要が見つかっ
G_list = [] 

G_list.append(l_rule[0]) 

EDIT:修飾を有するコード

with open('file.txt') as f: 
    for l in f: 

     l_rule = l.split() 

     G_list = [] # clear list 

     G_list.append(l_rule[0]) 

     length= len(l_rule) 

     if length == 3: 
       m = (l_rule[2],) # create tuple instead of string 
       G_list.append(m) 
     else: 
       m = (l_rule[2], l_rule[3]) # create tuple instead of string 
       G_list.append(m) 

     print(G_list) 
     listoflist.append(G_list) 

print(listoflist) 
+0

もっと説明できますか?正確な版を投稿しますか?私は理解できませんでした – lel

+0

2つの要素 '' h "'と '' yes ''を持つ単一文字列 ''(" h "、" yes ")' 'タプルを作成します – furas

+0

aswerのコードを参照 – furas

2

分割各行して解凍。次に、必要な最後の要素が見つかったかどうかをチェックし、適切なタプルを作成します。結果をあなたのリストに追加します。

def format_data(line): 
    lst = line.split() 
    return lst[0], tuple(lst[2:]) 

with open('file.txt') as f: 
    for l in f: 
     G_list.append(format_data(l)) 
listoflist.append(G_list) 

するか、あなたのwith文の中one_linerを行うことができます。

with open('file.txt') as f: 
    result = [] 
    for line in f: 
     a,b,c,*d = line.split() 
     if d: 
      tup = c,d[0] 
     else: 
      tup = c, 
     result.append([a, tup]) 
+0

うーん、チェックをしないで 'tup =(c、)+ tuple(d)'を実行するだけで逃げることができますか? –

+0

@ juanpa.arrivillaga - それもうまくいくでしょう。 – TigerhawkT3

0

これを試してみてください。

with open('file.txt') as f: 
    listoflist = [format_data(l) for l in f] 
0

一つの簡単な方法は、空白(splitのデフォルト)で最初=によると、その後分割の二つのパスを、行うことです。 strip必要に応じてを使用します。

>>> import io 
>>> s = """Fail = h yes 
... Sucess = h no 
... Fail = h """ 
>>> 
>>> L = [line.strip().split('=') for line in io.StringIO(s)] 
>>> [[sub[0].strip(),tuple(sub[1].strip().split())] for sub in L] 
[['Fail', ('h', 'yes')], ['Sucess', ('h', 'no')], ['Fail', ('h',)]] 
>>> 

メモリが問題であるならば、あなたはなまけ行を処理するために上記を適応させることができます。

関連する問題