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しかし、とにかく各消費者をループする必要があることを取得するには、2 つを組み合わせたほうがよいことに気付きました。

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

最も効率的な検索プロセスが必要な場合は、辞書データ構造を使用する必要があります。これは、複雑さ (成長の順序) が最小であるためです。次の方法で実行できます。

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 に答える
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 に答える