2016-12-13 23 views
2

私はこれで3日ほど前から立ち往生していましたが、私は非常に多くの方法を試みましたが、どれも成功していませんでした。txtファイルから3Dリストを作成するには? python

私は2行3列で構成された3Dのリストにこのファイルを置くことができますどのように
1234 
4321 
3214 
3321 
4421 
2341 

txtファイル(num.txtが)のように見えますか?

私が達成しようとしています出力は次のとおりです。

[ [['1','2','3','4']['4','3','2','1']['3','2','1','4']], [['3','3','2','1']['4','4','2','1']['2','3','4','1']] ] 

(私はそれが簡単に見ることにする試みで、もう少しそれを間隔をあけました!)

私はそれが可能だろうと思いました2Dリストを作成するのと同様ですが、私は何もしませんでした!誰でも助けてくれますか?

ありがとうございました!あなたが好きなlistにファイルとタイプキャストラインの各文字列を開く必要が

答えて

1

:ここ

my_list = [] 
sublist_size = 3 

with open('/path/to/num.txt') as f: 
    file_lines = list(f) 
    for i in range(0, len(file_lines), sublist_size): 
     my_list.append([list(line.rstrip()) for line in file_lines[i:i+sublist_size]]) 
     #       ^Remove `\n` from right of each line 

my_listは、あなたが望む値を保持します:

[[['1','2','3','4']['4','3','2','1']['3','2','1','4']], 
[['3','3','2','1']['4','4','2','1']['2','3','4','1']]] 
+0

忘れてはいけないと '.strip()' ' '\ n''をそれぞれの行の – jez

+0

いいえ、少なくともPython 2.7では、改行は各行に含まれています – jez

+0

はい、私の悪いです。答えを更新する。それを指摘してくれてありがとう –

2

をここでは非常に単純な方法ですいくつかの簡単な計算でそれを行う:

with open('num.txt') as infile: # open file 
    answer = [] 
    for i,line in enumerate(infile): # get the line number (starting at 0) and the actual line 
     if not i%3: answer.append([]) 
     answer[-1].append(list(line.strip())) 
+1

充分に大きなファイルの場合、ファイル全体をメモリにロードする必要がないので、このアプローチはほとんど必須です。 – TemporalWolf

+0

@TemporalWolf: 'answer 'はファイル全体を保持するようになっているので、ジェネレータを作成して3行ずつ出力する必要がある場合を除き、議論の余地があります。もしオペレーションが実際にファイル行の3倍のリストを望むなら、リストの代わりにタプルを使うのは助けになるかもしれません。答えはスペースの中に '答え'の中に入れます。 – inspectorG4dget

+0

他の答えは両方とも、それに**。あなたのソリューションは、結果を定期的に保存して、メモリ内に完全に保持することができないファイルを処理するために使用できます。これは、2つのイテレータとPythonのインテリジェントファイルバッファを使用します。 – TemporalWolf

1

012を使用する解決策機能とシンプルなリスト内包表記

with open('./text_files/num.txt', 'r') as fh: # change to your current file path 
    l = [list(l.strip()) for l in fh] 

n = 3 # chunk size 
result = [l[i:i + n] for i in range(0, len(l), n)] # splitting into chunks of size 3 
print(result) 

出力:

[[['1', '2', '3', '4'], ['4', '3', '2', '1'], ['3', '2', '1', '4']], [['3', '3', '2', '1'], ['4', '4', '2', '1'], ['2', '3', '4', '1']]] 
+0

[.readlines()](http://stupidpythonideas.blogspot.com/2013/06/readlines-considered-silly.html)は、ファイル全体を読み込み、返される前に解析するため、処理が遅くなります。 'for l in fh'は必要に応じて行を返すイテレータを返します。 – TemporalWolf

+0

@TemporalWolf、OK、それを削除しました。ヒントをありがとう – RomanPerekhrest

0

私は明確で、ファイル全体をメモリにロードする必要がないと思うもう一つのオプション:

inner_size = 3 
inner_range = range(inner_size) # precompute this since we'll be using it a lot 
with open('/home/user/nums.txt') as f: 
    result = [] 
    try: 
     while True: 
      subarr = [] 
      for _ in inner_range: 
       subarr.append(list(f.next().rstrip())) 
      result.append(subarr) 
    except StopIteration: 
     pass 

ファイルオブジェクトに組み込みの__iter__を使用して、サブアレイを作成し、結果の上に追加します配列を削除し、例外が発生したことを知りたい場合はStopIteration例外を使用して、余分なデータを破棄します。あなたが最後に部分的な下位を保持したい場合は、例外的に簡単にif subarr: result.append(subarr)を実行することができます。リスト内包として書かれ

(ただし最終的な、部分的なサブリスト回復する能力なし):端から

inner_size = 3 
inner_range = range(inner_size) 
with open('/home/user/nums.txt') as f: 
    result = [] 
    try: 
     while True: 
      result.append([list(f.next().rstrip()) for _ in inner_range]) 
    except StopIteration: 
     pass 
関連する問題