2012-12-19 68 views
1

我有消費者列表:檢索值

API_CONSUMERS = [{'name': 'localhost', 
        'host': '127.0.0.1:5000', 
        'api_key': 'Ahth2ea5Ohngoop5'}, 
       {'name': 'localhost2', 
        'host': '127.0.0.1:5001', 
        'api_key': 'Ahth2ea5Ohngoop6'}] 

而且我有一個主機變量:

host = '127.0.0.1:5000' 

我想:

  1. 檢查主機位於API_CONSUMERS列表中的值中,則
  2. 如果主機存在,則檢索api_key在別處使用。

本來我是檢查主機值是這樣的:

if not any(consumer['host'] == host for consumer in API_CONSUMERS): 
    #do something 

但後來意識到檢索api_key我將不得不通過每個消費者循環無論如何,所以還不如將二者結合起來:

for consumer_info in API_CONSUMERS: 
    if consumer_info['host'] == host: 
     consumer = consumer_info 
if not consumer: 
    #do something 

這樣做的最好方法是什麼?我覺得我所做的不是「pythonic」。

解決方案

try: 
    api_key = next(d['api_key'] for d in consumers if d['host'] == host) 
except StopIteration: 
    #do something 
+0

主機值是否始終是唯一的?如果是這樣的話,字典詞典是以主機作爲關鍵字的更好的數據類型。 –

+0

是的,主機值始終是唯一的。 –

回答

3
>>> next(consumer['api_key'] for consumer in API_CONSUMERS if consumer['host'] == host) 
'Ahth2ea5Ohngoop5' 

不要忘了捕獲異常,這將是如果未找到該值,則進行提升。

+0

完美,謝謝。 –

0

A(也許)更蟒蛇結構是使用換別的:

for consumer_info in API_CONSUMERS: 
    if consumer_info['host'] == host: 
     consumer = consumer_info 
     #do stuff with consumer 
     break 
else: 
    #clause if no consumer 
3
api_key = next(d['api_key'] for d in API_CONSUMERS if d['host'] == host) 

將一次性得到密鑰,並且如果列表中沒有這樣的主機,將會引發異常。

編輯

由於sr2222指出,如果主機是不是唯一的OP代碼的語義和我是不同的。所以要得到最後一個主機,可以這樣做:

api_key = [d['api_key'] for d in API_CONSUMERS if d['host'] == host][-1] 

或者只是保留整個列表。 (如果列表爲空,則仍會引發異常)。

+0

這與他的代碼所做的有細微但重要的不同。他的代碼將獲得主機與目標主機相匹配的最後一個消費者,您將在其中獲得第一個消費者。他可能會更好地獲得你創建的發電機,並根據需要進行迭代。 –

+0

的確如此,但我認爲我們都是在獨特主機的假設下工作的。如果我錯了,OP可以糾正我。 – StoryTeller

+0

抱歉,我無法接受這兩個答案 - 我接受了另一個,因爲他先回答了。 –

0

,如果你想擁有最高效的搜索過程中,你應該使用字典數據structure.because它的複雜性(增長級)是least.you可以這樣來做:

API_CONSUMERS = {'127.0.0.1:5000':{'name':'localhost','api_key': 'Ahth2ea5Ohngoop5'}, 
       '127.0.0.1:5001': {'name':'localhost2','api_key': 'Ahth2ea5Ohngoop6'}} 

並且如果您要搜索使用:

if host in API_CONSUMERS.keys(): 
    return API_CONSUMERS[host]['api_key']