2017-11-28 4 views
1

私はテキストファイルに含まれている2つの行列を手作業でマージする必要はありません。それは次のようになります。行列を連結するPYTHON(numpyなし)

[[1,2][3,4]],[[5,6,7],[8,9,10]] 

私はこのコードを持っている:

def combine(filename): 
    with open(filename, 'r') as myfile: 
     data=myfile.read().split() 
     a=data[0].split() 
     b=data[1].split() 
    a=eval(a[0]) 
    b=eval(b[0]) 
    row_a=len(a) 
    row_b=len(b) 
    col_a=len(a[0]) 
    col_b=len(b[0]) 
    concatenated=[] 
    if row_a==row_b: #build horizontally 
     for i in range (row_a): 
      concatenated.append(a[i]) 
      for i in range (row_b): 
       concatenated.append(b[i]) 
     return concatenated 
    if col_a==col_b: #build vertically 
     for i in range (col_a): 
      concatenated.append(a[i]) 
      for i in range (col_b): 
       concatenated.append(b[i]) 
     return concatenated 
    else: 
     print ("Error") 

をしかし、それは返します

[[1, 2], [5, 6, 7], [8, 9, 10], [3, 4], [5, 6, 7], [8, 9, 10]] 

の代わりに:

[[1,2,5,6,7],[3,4,8,9,10]] 

どのように私ができる上の任意のアイデアをこの作品を作る?前もって感謝します!

答えて

2

あなたはast.literal_evalを使用することができます。

import ast 
final_results = [a+b for a, b in zip(*ast.literal_eval(open('filename.txt')))] 

出力:

[[1, 2, 5, 6, 7], [3, 4, 8, 9, 10]] 

編集:任意のインポートせずに、あなたがevalを使用することができます。唯一の信頼できるソースから文字列上で実行する必要がありますので、evalが非常に安全ではないことに注意してくださいと:インポートを使用せずにこれを行う方法は

final_results = [a+b for a, b in zip(*eval(open('filename.txt').read()))] 
+0

ありますか? :) ありがとうございました! –

+0

@FatCat私の最近の編集をご覧ください。 – Ajax1234

+0

ありがとう、既存のコードを編集するだけの場合は、if文の下に連結した[[a + b]を挿入することはできませんか? –

関連する問題