2017-01-24 6 views
1

私は、グラフのエッジリストであるPythonでかなりの配列(8000ish entires)を持っています。配列の一部は次のようになります。Pythonの配列から.gml(または読みやすいmathematica)ファイルを書く

... [' Tulane-B (Tulane (Bacchus)) ', ' Florida Tech (Florida Tech) '], 
[' Stanford-B (Stanford Prison Experiment) ', ' San Jose State (Megabyte) '], 
[' Stanford-B (Stanford Prison Experiment) ', ' Duke (Brimstone) '], 
[' Stanford-B (Stanford Prison Experiment) ', ' Oregon State (Beavers) '],... 

文字列は、それらの間にエッジを持つ頂点のペアをペアにします。

この配列をmathematicaに読み込んで読み込む効率的な方法はありますか?私はmathematicaの文字列が{に囲まれていることを知っています。この配列をPythonから別の形式でエクスポートすることはできますか?それとも、文字列として再解析する必要がありますか? 私のコードは次のようになります。最後の印刷の呼び出しに

print('{', end = '') 
for edge in named_edgelist: 
     print('{' + '\"' + edge[0] +'\"' + ", " +'\"' + edge[1] + '\"' + '},', end ='') 
print('}',end = '') 

第二は、余分なコンマになりますが、私はそれを心配ありませんよ。

ありがとうございます。

+0

。 '{{" a "、" b "}、{" c "、" d "}}'などのようなものが必要だと思います。だからあなたは自分でこれをコード化し、あなたのコードの試みを質問に貼り付けるべきです。 –

+0

あなたの例は、私が代わりに書いた形式です。問題のポイントは、教育目的のためですが、これを行う簡単な方法があります。私は簡単に文字列の書式設定を行うことができますが、将来の時間を節約するために、それらがより効率的な方法であるかどうか疑問に思っています。 – tharvey

+0

文字列の書式設定でこれを行うにはいくつかの方法があります。現在行っていることを実際に見ることができない場合、現在行っていることよりも効率的な方法を提案するのは少し難しいです。 –

答えて

0

データがクリーンである、つまり二重引用符または角括弧が含まれていないため、str.translateメソッドを使用して、リストのPythonのネイティブ文字列表現をMathematica形式に変換できます。

str.translateを使用するには、まずstr.maketransメソッドを使用して変換テーブルを作成する必要があります。

data = [ 
    [' Tulane-B (Tulane (Bacchus)) ', ' Florida Tech (Florida Tech) '], 
    [' Stanford-B (Stanford Prison Experiment) ', ' San Jose State (Megabyte) '], 
    [' Stanford-B (Stanford Prison Experiment) ', ' Duke (Brimstone) '], 
    [' Stanford-B (Stanford Prison Experiment) ', ' Oregon State (Beavers) '], 
] 

trans = str.maketrans("'[]", '"{}') 
s = str(data).translate(trans) 
print(s) 

出力

{{" Tulane-B (Tulane (Bacchus)) ", " Florida Tech (Florida Tech) "}, {" Stanford-B (Stanford Prison Experiment) ", " San Jose State (Megabyte) "}, {" Stanford-B (Stanford Prison Experiment) ", " Duke (Brimstone) "}, {" Stanford-B (Stanford Prison Experiment) ", " Oregon State (Beavers) "}} 

ほぼすべての作業がCで書かれたコードによって行われているので、それがCの速度で動作しますので、これは、PythonはPythonの文字列フォーマットでループを使用するよりも高速です。


FWIW、これはマイナーチェンジで、Pythonの2にもを行うことができます。 Python 2では、str.maketransメソッドはありません。代わりに、string.maketransヘルパー機能を使用する必要があります。


各行を別々の行に表示する場合は、各行を前処理する必要があります。これは必然的に少し遅くなりますが、速度差は8000行ではほとんど目立たなくなります。

data = [ 
    [' Tulane-B (Tulane (Bacchus)) ', ' Florida Tech (Florida Tech) '], 
    [' Stanford-B (Stanford Prison Experiment) ', ' San Jose State (Megabyte) '], 
    [' Stanford-B (Stanford Prison Experiment) ', ' Duke (Brimstone) '], 
    [' Stanford-B (Stanford Prison Experiment) ', ' Oregon State (Beavers) '], 
] 

# Convert data to strings with each row on a separate line 
s = '[\n ' + ',\n '.join([str(row) for row in data]) + '\n]' 

trans = str.maketrans("'[]", '"{}') 
s = s.translate(trans) 
print(s) 

ない全てのPythonプログラマーはMathematicaを知っているので、あなたは、あなたの質問にご期待出力を追加する必要があり、出力

{ 
    {" Tulane-B (Tulane (Bacchus)) ", " Florida Tech (Florida Tech) "}, 
    {" Stanford-B (Stanford Prison Experiment) ", " San Jose State (Megabyte) "}, 
    {" Stanford-B (Stanford Prison Experiment) ", " Duke (Brimstone) "}, 
    {" Stanford-B (Stanford Prison Experiment) ", " Oregon State (Beavers) "} 
} 
関連する問題