【问题标题】:Extracting strings from a dict从字典中提取字符串
【发布时间】:2023-01-13 08:33:27
【问题描述】:

我正在尝试获取在 EC2 中创建的网络接口,因此我正在使用 boto3 中的“describe_network_interfaces”函数。这个函数的输出是一个像这样的结构:

{
    'NetworkInterfaces': [
        {
            'Association': {
                'AllocationId': 'string',
                'AssociationId': 'string',
                'IpOwnerId': 'string',
                'PublicDnsName': 'string',
                'PublicIp': 'string',
                'CustomerOwnedIp': 'string',
                'CarrierIp': 'string'
            },
            'Attachment': {
                'AttachTime': datetime(2015, 1, 1),
                'AttachmentId': 'string',
                'DeleteOnTermination': True|False,
                'DeviceIndex': 123,
                'NetworkCardIndex': 123,
                'InstanceId': 'string',
                'InstanceOwnerId': 'string',
                'Status': 'attaching'|'attached'|'detaching'|'detached',
                'EnaSrdSpecification': {
                    'EnaSrdEnabled': True|False,
                    'EnaSrdUdpSpecification': {
                        'EnaSrdUdpEnabled': True|False
                    }
                }
            },
            'AvailabilityZone': 'string',
            'Description': 'string',
            'Groups': [
                {
                    'GroupName': 'string',
                    'GroupId': 'string'
                },
            ],
            'InterfaceType': 'interface'|'natGateway'|'efa'|'trunk'|'load_balancer'|'network_load_balancer'|'vpc_endpoint'|'branch'|'transit_gateway'|'lambda'|'quicksight'|'global_accelerator_managed'|'api_gateway_managed'|'gateway_load_balancer'|'gateway_load_balancer_endpoint'|'iot_rules_managed'|'aws_codestar_connections_managed',
            'Ipv6Addresses': [
                {
                    'Ipv6Address': 'string'
                },
            ],
            'MacAddress': 'string',
            'NetworkInterfaceId': 'string',
            'OutpostArn': 'string',
            'OwnerId': 'string',
            'PrivateDnsName': 'string',
            'PrivateIpAddress': 'string',
            'PrivateIpAddresses': [
                {
                    'Association': {
                        'AllocationId': 'string',
                        'AssociationId': 'string',
                        'IpOwnerId': 'string',
                        'PublicDnsName': 'string',
                        'PublicIp': 'string',
                        'CustomerOwnedIp': 'string',
                        'CarrierIp': 'string'
                    },
                    'Primary': True|False,
                    'PrivateDnsName': 'string',
                    'PrivateIpAddress': 'string'
                },
            ],
            'Ipv4Prefixes': [
                {
                    'Ipv4Prefix': 'string'
                },
            ],
            'Ipv6Prefixes': [
                {
                    'Ipv6Prefix': 'string'
                },
            ],
            'RequesterId': 'string',
            'RequesterManaged': True|False,
            'SourceDestCheck': True|False,
            'Status': 'available'|'associated'|'attaching'|'in-use'|'detaching',
            'SubnetId': 'string',
            'TagSet': [
                {
                    'Key': 'string',
                    'Value': 'string'
                },
            ],
            'VpcId': 'string',
            'DenyAllIgwTraffic': True|False,
            'Ipv6Native': True|False,
            'Ipv6Address': 'string'
        },
    ],
    'NextToken': 'string'
}

我怎样才能只从“NetworkInterfaceId”中获取值并将其放入列表中?我正在尝试使用正则表达式提取此值,但我还没有很好的技能。请你们帮帮我好吗?

【问题讨论】:

  • 你试过什么了?
  • 你知道听写是如何工作的吗? mydict["网络接口"]...
  • @Alex_X1 数据不是一个有效的字典
  • 如果数据曾是你可能会做的有效字典print([x["NetworkInterfaceId"] for x in data["NetworkInterfaces"]])
  • @JonSG 是的,这是真的,但他在标题中提到了一个字典,所以我猜这是一个有效的字典

标签: python list dictionary pyspark


【解决方案1】:

要从字典中获取值,您必须“导航”到它。例如:

my_network_interface_id = my_dict["NetworkInterfaces"][0]["NetworkInterfaceId"]

我们需要 0 来获取数组的第一个元素。您可能还想看看@JonSG 的回答。

【讨论】:

  • 如果有多个值,他应该从字典中得到一个列表,或者一个我不完全确定的集合
  • 如果 my_dict 设置为提供的数据,这将产生错误,因为提供的数据不会产生有效的字典。 TypeError: unsupported operand type(s) for |: 'str' and 'str'
  • 我知道并且我注意到了,所以这可能是作者的错误,如果字典有效,我的答案应该有效
  • 确定的事情。由于 OP 想要一个“列表”,您可能会添加我在上面的 cmet 中添加的列表理解
  • 你的代码,亚历克斯
【解决方案2】:

你可以用 short for 来做

network_interfaces = [interface["NetworkInterfaceId"] for interface in response["NetworkInterfaces"]]

【讨论】:

    【解决方案3】:

    mydict['NetworkInterfaces'][0]['NetworkInterfaceId']

    【讨论】:

    • 当我有超过 1 个 NetworkInterfaceId 时?那个结构可以复制,你知道吗?
    猜你喜欢
    • 2020-12-30
    • 2017-02-09
    • 2016-06-24
    • 2022-06-10
    • 2017-12-15
    • 1970-01-01
    • 2021-09-28
    • 1970-01-01
    相关资源
    最近更新 更多