2015-12-08 2 views
0

У меня есть кусок кода, чтобы получить значение определенного ключа в dict. Он отлично работает и возвращает список, но теперь я хочу, чтобы получить больше 1 ключ и, возможно, сохранить его в СловареQuery 2 keys from Python dict

def find(key, dictionary): 
    for k, v in dictionary.iteritems(): 
     if k == key: 
      yield v 
     elif isinstance(v, dict): 
      for result in find(key, v): 
       yield result 
     elif isinstance(v, list): 
      for d in v: 
       for result in find(key, d): 
        yield result 

Я много о Python не знаю, я мог бы запустить эту функцию дважды, чтобы достичь своей цели но хотелось бы знать, как это можно изменить, поэтому я запускаю только один раз.

EDIT: моя цель состоит в том, чтобы получить значения SnapshotId и StartTime из следующего словаря, будет несколько Snapshots список возвращается

{ 
    'Snapshots': [ 
     { 
      'SnapshotId': 'string', 
      'VolumeId': 'string', 
      'State': 'pending'|'completed'|'error', 
      'StateMessage': 'string', 
      'StartTime': datetime(2015, 1, 1), 
      'Progress': 'string', 
      'OwnerId': 'string', 
      'Description': 'string', 
      'VolumeSize': 123, 
      'OwnerAlias': 'string', 
      'Tags': [ 
       { 
        'Key': 'string', 
        'Value': 'string' 
       }, 
      ], 
      'Encrypted': True|False, 
      'KmsKeyId': 'string', 
      'DataEncryptionKeyId': 'string' 
     }, 
    ], 
    'NextToken': 'string' 
} 

Это мой текущий код:

def find(keys, dictionary): 
    for k, v in dictionary.iteritems(): 
     if k in keys: 
      yield v 
     elif isinstance(v, dict): 
      for result in find(key, v): 
       yield result 
     elif isinstance(v, list): 
      for d in v: 
       for result in find(key, d): 
        yield result 

def findDate(key, dictionary): 
    for k, v in dictionary.iteritems(): 
     if k == key: 
      yield v 
     elif isinstance(v, dict): 
      for result in find(key, v): 
       yield result.strftime('%Y/%m/%d') 
     elif isinstance(v, list): 
      for d in v: 
       for result in find(key, d): 
        yield result.strftime('%Y/%m/%d') 

    response = ec2.describe_snapshots(
     Filters=[ 
      { 
       'Name': 'volume-id', 
       'Values': [ 
        VOLUMEID, 
       ] 
      }, 
     ] 
    ) 

    recentSnapshots_id = list(find('SnapshotId', response)) 

    recentSnapshots_date = list(findDate('StartTime', response)) 

    print (dict(zip(recentSnapshots_id, recentSnapshots_date))) 
+2

Просто передайте список вместо ключа, вызовите его, затем проверьте «if k in keys» –

+0

или, чтобы получить более удобный интерфейс: 'def find (словарь, * keys)' –

+0

Извините, я в замешательстве, мне нужно только передать список с той же функцией, или мне нужно добавить больше кода в функцию? – Casper

ответ

0

Если у вас строгая структура, не перебирайте все значения. Вместо этого:

[{'SnapshotId': s['SnapshotId'], 'StartTime':s['StartTime']} for s in data['Snapshots']] 

или

{ s['SnapshotId']:s['StartTime'] for s in data['Snapshots'] } 

для id-> словарю времени.

+0

Я не знаю Python, как бы я это использовал? это функция? – Casper