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
4

4 回答 4

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

如果找不到值,不要忘记捕获将引发的异常。

于 2012-12-19T17:40:32.360 回答
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]

或者只保留整个列表。(如果列表为空,仍会引发异常)。

于 2012-12-19T17:41:21.037 回答
0

一个(也许)更多的 python 构造是使用 for-else:

for consumer_info in API_CONSUMERS:
    if consumer_info['host'] == host:
        consumer = consumer_info
        #do stuff with consumer
        break
else:
    #clause if no consumer
于 2012-12-19T17:39:27.230 回答
0

如果你想有最有效的搜索过程,你应该使用字典数据结构。因为它的复杂性(增长顺序)是最少的。你可以这样做:

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']
于 2012-12-19T17:52:31.617 回答