2015-07-11 43 views
1

我正在尋找一種以通用方式「解壓縮」字典的方法,並找到解釋各種技術(TL; DR:它不太優雅)的a relevant question(和答案)。是否可以在一次調用中「解開」一個字典?

但是,這個問題解決了字典中的鍵未知的情況,OP將它們自動添加到本地名稱空間中。

我的問題可能更簡單:我從一個函數中獲得一個字典,並且想知道我需要的密鑰(我可能不需要每次都需要它們)。現在我只能做

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

x = myfunc() 
a = x['a'] 
my_b_so_that_the_name_differs_from_the_key = x['b'] 
# I do not need c this time 

,而我一直在尋找的

def myotherfunc(): 
    return 1, 2 

a, b = myotherfunc() 

相當於而是一個字典(這是由我的函數返回)。我不想使用後一種解決方案,其中一個原因是,哪個變量對應哪個返回元素(第一個解決方案至少具有可讀性的優點)並不明顯。

這樣的操作是否可用?

+0

'A,B = FOO()得到( 'A'),富()得到( 'B')'我想可以工作。以通常的方式拆封它的問題是無序的字跡。 – IanAuld

+0

謝謝,但我不想調用該函數兩次(或更多),否則我會去我的問題中提到的(第一)解決方案。 – WoJ

回答

2

如果你真的必須,您可以使用operator.itemgetter() object提取多個鍵的值作爲一個元組:

from operator import itemgetter 

a, b = itemgetter('a', 'b')(myfunc()) 

這仍然是不漂亮;我寧願明確和可讀的分開的行,你首先分配返回值,然後提取這些值。

演示:

>>> from operator import itemgetter 
>>> def myfunc(): 
...  return {'a': 1, 'b': 2, 'c': 3} 
... 
>>> itemgetter('a', 'b')(myfunc()) 
(1, 2) 
>>> a, b = itemgetter('a', 'b')(myfunc()) 
>>> a 
1 
>>> b 
2 
2

您還可以使用地圖:

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

a,b = map(myfunc().get,["a","b"]) 
print(a,b) 
0

除了operator.itemgetter()方法,你也可以寫自己的myotherfunc()。它將所需鍵的列表作爲參數並返回其相應值的元組。

def myotherfunc(keys_list): 
    reference_dict = myfunc() 
    return tuple(reference_dict[key] for key in keys_list) 

>>> a,b = myotherfunc(['a','b']) 
>>> a 
1 
>>> b 
2 

>>> a,c = myotherfunc(['a','c']) 
>>> a 
1 
>>> c 
3 
相關問題