2012-06-23 10 views
5

मैं इसपाइथन dict की सामग्रियों को एक साथ कई चरों पर असाइन करें?

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

{ a, b } = f()  # or { 'a', 'b' } = f() ? 

यानी की तरह कुछ करना चाहते हैं ताकि एक सौंप दिया जाता है 1, बी 2 हो जाता है, और ग अपरिभाषित है

यह इस

def f() 
    return(1,2) 

a,b = f() 
+0

तुम ऐसा क्यों करना चाहते हो? आपके पास पहले से ही डेटा में डेटा है, और इसे आसानी से प्राप्त कर सकता है: 'd = f(); डी ['ए'] # ... 'यदि आप वास्तव में नामों को दोबारा जोड़ना चाहते हैं: 'd = f(); ए, बी = डी ['ए'], डी ['बी'] 'कुछ खो रहा है? –

उत्तर

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') 

यह वास्तव में सभी overkill हालांकि है। कुछ आसान बेहतर होगा:

result = f() 
a, b = result['a'], result['b'] 
+0

हम्म ... अच्छी तरह से thx @Eric, लेकिन बिंदु वैरिएबल नामों को दो बार टाइप करने की अनावश्यकता से बचने के लिए है। मैं बस शब्दकोश से चर के लिए जाने का सबसे आसान तरीका देख रहा हूं। एक जैसी चीज जो मैं करना चाहूंगा वह इस तरह की ' तालिका = [{'ए': 1, 'बी': 2}, {'ए': 5, 'बी': 6}, .. ।] एक के लिए , तालिका में ख: ... कुछ करना बजाय तालिका में mydict के लिए: ए, बी = mydict [ 'एक'], mydict [ 'बी'] ...कुछ करें ' – joelhoro

+1

@cozycoding: आपको इसकी आवश्यकता क्यों है? शब्दकोश में डेटा छोड़ दो! – Eric

+0

@cozycoding: (WRT संपादित करें) यदि आप शब्दकोशों के बजाय कक्षाओं का उपयोग करते हैं, तो आप 'तालिका में आइटम के लिए' कर सकते हैं: foo (item.a, item.b) '। – Eric

3

हम्म। एक शब्दकोश के बाद अजीब तरह का आदेश नहीं दिया जाता है, इसलिए मूल्य अनपॅकिंग चर नामों पर निर्भर करता है। लेकिन, यह संभव है, अगर बदसूरत:

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

घर पर यह कोशिश न करें! यह एक रखरखाव दुःस्वप्न है। लेकिन थोड़े शांत भी :-)

+5

ध्यान दें कि पायथन दस्तावेज़ विशेष रूप से बताते हैं कि आपको 'स्थानीय() 'के परिणाम को उत्परिवर्तित नहीं करना चाहिए। यह ठीक काम कर सकता है, लेकिन भविष्य में किसी बिंदु पर यह कोड अपवाद फेंक सकता है, या बदतर कुछ पूरी तरह से समझदार नहीं कर सकता है। –

+1

@ गीफ: जानना अच्छा है। इसका उपयोग करने के लिए और भी अधिक कारण :-) – Cameron

+0

@ कैमरॉन - इससे बचने के लिए मुझ पर भरोसा करें! Thx – joelhoro

5

f बनाने एक namedtuple तो फिर तुम सिर्फ f.a उपयोग कर सकते हैं पर विचार करें, f.b सीधे

0

आप इस्तेमाल कर सकते हैं (या दुरुपयोग) यह करने के लिए एक समारोह विशेषता:

>>> 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) 

ध्यान रखें कि गुणों के पास केवल एफ() को कॉल करने या मैन्युअल रूप से असाइन किए जाने के बाद मान होता है।

मैं (कभी-कभी) उपयोग समारोह एक भरने में सी static वर्ग चर के लिए तो जैसे गुण:

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

ऐसा करने के लिए बेहतर तरीके हैं, लेकिन अभी पूरा नहीं करने के लिए ...

संबंधित मुद्दे