8

scipy.io.loadmatを使用して.matファイルからロードされた基本的な辞書temp={'key':array([1,2])}を取得しようとしています。loadmat()によって返されたPythonディクショナリファイルのキーを、キーを表すのと同じ値を持つ変数名に変換します。

したがって、たとえば:

temp = {'key':array([1,2])}

になって

key = array([1,2])

temp.keys()でキーを取得する方法を知っています。次に、アイテムを取得するのは簡単ですが、temp.keys()内の文字列のリストを文字列ではなく変数名に強制するにはどうすればよいですか。

私はこれが理にかなっていることを願っていますが、これはおそらく本当に簡単です私はそれを行う方法を考えることができません。

乾杯

4

6 に答える 6

11

Python では、メソッド パラメーターを辞書として**マジックで渡すことができます。

def my_func(key=None):
   print key
   #do the real stuff

temp = {'key':array([1,2])}

my_func(**temp)

>>> array([1,2])
于 2011-06-16T10:16:03.073 に答える
4

を使用するのが最善の方法temp['key']です。ただし、質問に答えるには、exec関数を使用できます。この方法の利点は、変数名をハードコーディングしたり、関数内での作業に限定したりする必要がないことです。

from numpy import array,matrix

temp = {'key':array([1,2]),'b': 4.3,'c': 'foo','d':matrix([2,2])}

for k in temp:
    exec('{KEY} = {VALUE}'.format(KEY = k, VALUE = repr(temp[k])))

>>> key
array([1, 2])
>>> b
4.3
>>> c
'foo'
>>> d
matrix([[2, 2]])

注 :これは、モジュールから特定の関数をインポートした場合にのみ機能します。コードの練習や、インポートする必要のある関数の膨大な量のためにこれを行いたくない場合は、エントリの前にモジュール名を連結する関数を書くことができます。出力は前の例と同じです。

import numpy as np,numpy

temp = {'key':np.array([1,2]),'b': 4.3,'c': 'foo','d':np.matrix([2,2])}

def exec_str(key,mydict):
    s = str(type(mydict[key]))
    if '.' in s:
        start = s.index("'") + 1
        end = s.index(".") + 1
        v = s[start:end:] + repr(mydict[key])
    else:
        v = repr(mydict[key])     
    return v

for k in temp:
    exec('{KEY} = {VALUE}'.format(KEY = k, VALUE = exec_str(k,temp)))

これはコードのベスト プラクティスではありませんが、テストしたすべての例でうまく機能します。

于 2013-06-12T01:42:02.027 に答える
2

より良い方法は、データを別のオブジェクトに詰め込むことです。

class attrdict(dict):
    def __getattr__(self, k): return self[k]
    def __setattr__(self, k, v): self[k] = v

somedict = {'key': 123, 'stuff': 456}

data = attrdict(somedict)
print data.key
print data.stuff

これはインタラクティブに使用するのと同じくらい簡単で、魔法は必要ありません。これは、Matlab ユーザーにとっても問題ありません。

編集:以下のものは実際にはほとんどの場合機能しないことがわかりました。残念ながら、魔法はこれで終わりです。

ただし、魔法に干渉したい場合は、次のようなことができます

locals().update(somedict)

これはインタラクティブに問題なく動作locals()し、sys._getframe().f_back.f_locals.

ただし、これは関数では機能しません。

def foo():
    locals().update({'a': 4})
    print a 

ポイントは、a上記はコンパイル時にグローバル変数にバインドされているため、Python はローカル変数の中から検索しようとしないことです。

于 2011-06-16T11:58:56.770 に答える
1

hdhagman が答えたように、exec() を使用する方が簡単です。もっと簡単なコードを書きます。

temp = {'キー':[1,2]}

for k, v in temp.items():
    exec("%s = %s" % (k, v))

print(キー) => [1,2]

于 2020-09-15T03:51:11.703 に答える
0

ディクショナリを直接使用して のような配列にアクセスすることをお勧めしますがtemp['key']、事前にすべての変数名がわかっている場合は、それらを個々の変数に抽出する関数を作成できます。

def func(**kwargs):
    return kwargs['a'],kwargs['b']


temp = {'a':np.array([1,2]),'b':np.array([3,4])}
a,b = func(**temp)
del temp # get rid of temporary dict
于 2011-06-16T12:35:24.917 に答える