2012-06-23 13 views
5

1が割り当てられますように、bが2を取得し、cはPython dictの内容を複数の変数に同時に割り当てますか?私はこの</p> <pre><code>def f(): return { 'a' : 1, 'b' : 2, 'c' : 3 } { a, b } = f() # or { 'a', 'b' } = f() ? </code></pre> <p>すなわちような何かをしたいと思います

を定義されていないこれは、変数名に依存するように開梱のためにどんな意味がありません。この

def f() 
    return(1,2) 

a,b = f() 
+0

なぜあなたはこれをしたいのですか?あなたはすでにdictにデータを持っており、簡単に得ることができます: 'd = f(); d ['a']#... 'もしあなたが本当に名前を再バインドしたいなら、' d = f(); a、b = d ['a']、d ['b'] '何かがありませんか? –

答えて

8

に似ています。あなたが得ることができる最も近いです:

a, b = [f()[k] for k in ('a', 'b')] 

これは、もちろん、二回f()を評価します。次に行う

def unpack(d, *keys) 
    return tuple(d[k] for k in keys) 


あなたは関数を書くことができ

a, b = unpack(f(), 'a', 'b') 

これはしかし、本当にすべての過剰です。シンプルなものが良いでしょう:

+0

Hmm ...よくthx @ Ericですが、重要な点は変数名を2回入力することの冗長性を避けることです。私は辞書から変数に行く最も簡単な方法を見ています。私がしたいのと同じことは、次のようなものになります。 ' table = [{'a':1、 'b':2}、{'a':5、 'b':6}、.. 。について] 、表中のB: ...テーブルに はなくmydictため 何かを: 、B = mydict [ 'A']、mydict [ 'B'] ...何かをする ' – joelhoro

+1

@cozycoding:なぜあなたはする必要がありますか?辞書にデータを残す! – Eric

+0

@cozycoding:(WRT edit)辞書の代わりにクラスを使用すると、 'table:foo(item.a、item.b)'の項目に対して 'を実行できます。 – Eric

3

Hmm。辞書が順序付けされていないので、奇妙な種類なので、値のアンパックは変数名によって異なります。しかし、醜い場合は可能です:

>>> locals().update(f()) 
>>> a 
1 

家で試してみませんか?それは保守性の悪夢です。しかし

+5

pythonのdocsは、 'locals()'の結果を変更してはならないことを明記しています。今は問題なく動作するかもしれませんが、将来このコードが例外を投げるか、悪化すると完全に非妥当なものができます。 –

+1

@Geoff:お勧めします。これを使わないもっと多くの理由:-) – Cameron

+0

@Cameron - それを避けるために私を頼りにしてください! Thx – joelhoro

5

fnamedtuple次に、あなただけのあなたがこれを行うには、関数属性を使用(または乱用)ができ、直接

0

f.af.bを使用することができますことを検討:-)すぎてちょっとクール:

>>> def f(): 
... f.a=1 
... f.b=2 
... return { 'a' : f.a, 'b' : f.b, 'c' : 3 } 
... 
>>> f() 
{'a': 1, 'c': 3, 'b': 2} 
>>> a,b=f.a,f.b 
>>> a,b 
(1, 2) 

をf()が呼び出された後、または手動で代入された後にのみ属性に値があることに注意してください。

私が(まれに)利用機能がフィルインCの staticクラス変数のようになどの属性

>>> def f(i): 
... f.static+=i 
... return f.static 
>>> f.static=0 
>>> f(1) 
1 
>>> f(3) 
4 

があり、これを行うには良い方法ですが、ちょうど完全であることを...

関連する問題

 関連する問題