【问题标题】:Query 2 keys from Python dict从 Python dict 查询 2 个键
【发布时间】:2016-03-14 01:26:30
【问题描述】:

我有一段代码可以获取字典中已定义键的值。它工作得很好并返回一个列表,但现在我想再获得 1 个密钥并可能将其保存到一个字典中

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 不太了解,我可以运行这个函数两次来实现我的目标,但想知道如何修改它,所以我只运行一次。

编辑:我的目标是从以下字典中获取SnapshotIdStartTime 的值,将返回几个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)))

【问题讨论】:

  • 只传递一个列表而不是一个键,称之为键,然后检查if k in keys
  • 或者,有一个更好的界面:def find(dictionary, *keys)
  • 对不起,我很困惑,我只需要传入具有相同功能的列表还是需要在函数中添加更多代码?
  • 因为它是<genexp>,所以您可能只需循环两次即可获得两个值...不过我感觉我误解了您的问题。

标签: python amazon-web-services dictionary aws-lambda


【解决方案1】:

如果您有严格的结构,请不要遍历所有值。而是:

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

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

对于一个 id->时间字典。

【讨论】:

  • 我不懂 Python,我该如何使用它?是函数吗?
猜你喜欢
  • 2012-01-16
  • 2013-05-14
  • 1970-01-01
  • 2014-03-02
  • 1970-01-01
  • 1970-01-01
  • 2015-10-15
  • 1970-01-01
相关资源
最近更新 更多