【问题标题】:Python3: Iterate over data, print values for all keys matching stringPython3:迭代数据,打印匹配字符串的所有键的值
【发布时间】:2020-11-29 10:38:46
【问题描述】:

这里的超级新手,环顾四周,没有运气,但它真的让我大吃一惊。

我想为与某个字符串匹配的所有键提取相应的值。

在这种情况下,我收到了来自 docker API 列表容器的 GET 请求。 如图所示的两个容器,我想打印它们的“Id”和“Names”值。

同样出于好奇,我们将如何更深入地了解“PrivatePort”的价值?

干杯

[
    {
        "Id": "aa303658b81be27e932bfe4dad4fd3c12f0fb149963391a28657ca8a51549b80",
        "Names": [
            "/silly_chatterjee"
        ],
        "Image": "lgcon-base-steamcmd:latest",
        "ImageID": "sha256:3439f862bf7114f2a08ef684b7ebaa3b79cd0577906f473f9e04b1acb4071a27",
        "Command": "bash /steamcmd/steamcmd.sh",
        "Created": 1606578178,
        "Ports": [
            {
                "PrivatePort": 8080,
                "Type": "tcp"
            },
            {
                "PrivatePort": 28015,
                "Type": "tcp"
            },
            {
                "PrivatePort": 28016,
                "Type": "tcp"
            },
            {
                "PrivatePort": 28082,
                "Type": "tcp"
            }
        ],
        "Labels": {},
        "State": "running",
        "Status": "Up 7 hours",
        "HostConfig": {
            "NetworkMode": "default"
        },
        "NetworkSettings": {
            "Networks": {
                "bridge": {
                    "IPAMConfig": null,
                    "Links": null,
                    "Aliases": null,
                    "NetworkID": "21d2b28c7ba993d9e056a2a43c8c5a048461fe820a3a861bd0b7720b101232ca",
                    "EndpointID": "01b60812abb596b22d51692caec97fb52ced498b5961c27aa9b3c67d6d71ea95",
                    "Gateway": "172.17.0.1",
                    "IPAddress": "172.17.0.2",
                    "IPPrefixLen": 16,
                    "IPv6Gateway": "",
                    "GlobalIPv6Address": "",
                    "GlobalIPv6PrefixLen": 0,
                    "MacAddress": "02:42:ac:11:00:02",
                    "DriverOpts": null
                }
            }
        },
        "Mounts": []
    },
    {
        "Id": "93ffca099523727e2174e71bf0880e7b0edc3f7aa89279d37688f86061f237d5",
        "Names": [
            "/confident_wilbur"
        ],
        "Image": "lgcon-base-steamcmd:latest",
        "ImageID": "sha256:3439f862bf7114f2a08ef684b7ebaa3b79cd0577906f473f9e04b1acb4071a27",
        "Command": "bash /steamcmd/steamcmd.sh",
        "Created": 1606578168,
        "Ports": [
            {
                "PrivatePort": 28015,
                "Type": "tcp"
            },
            {
                "PrivatePort": 28016,
                "Type": "tcp"
            },
            {
                "PrivatePort": 28082,
                "Type": "tcp"
            },
            {
                "PrivatePort": 8080,
                "Type": "tcp"
            }
        ],
        "Labels": {},
        "State": "running",
        "Status": "Up 3 hours",
        "HostConfig": {
            "NetworkMode": "default"
        },
        "NetworkSettings": {
            "Networks": {
                "bridge": {
                    "IPAMConfig": null,
                    "Links": null,
                    "Aliases": null,
                    "NetworkID": "21d2b28c7ba993d9e056a2a43c8c5a048461fe820a3a861bd0b7720b101232ca",
                    "EndpointID": "802d3d63ce763999fc935b0ffcb77a394978e3608d4c7c3bb4f48664cde9bfb4",
                    "Gateway": "172.17.0.1",
                    "IPAddress": "172.17.0.3",
                    "IPPrefixLen": 16,
                    "IPv6Gateway": "",
                    "GlobalIPv6Address": "",
                    "GlobalIPv6PrefixLen": 0,
                    "MacAddress": "02:42:ac:11:00:03",
                    "DriverOpts": null
                }
            }
        },
        "Mounts": []
    }
]

编辑:

以下返回 'AttributeError: 'list' object has no attribute 'items'

import json

with open('test.json') as json_file:
    data = json.load(json_file)

def recursive_items(dictionary):
    for key, value in dictionary.items():
        if type(value) is dict:
            yield (key, value)
            yield from recursive_items(value)
        else:
            yield (key, value)



for key, value in recursive_items(data):
    print(key, value)

【问题讨论】:

标签: python arrays python-3.x loops


【解决方案1】:

也许这对你有帮助:

# turn json string into nested dictionaries 
data_nested_dicts = json.loads(data_json)

#iterate over containers
for container in data_nested_dicts:
    # get Id and Names
    container_id = container['Id']
    container_names = container['Names']

    # "collect" private ports
    container_private_ports = []
    for port in container['Ports']:
        container_private_ports.append(port['PrivatePort'])

    # print the data 
    print(container_id, container_names, container_private_ports)

输出:

aa303658b81be27e932bfe4dad4fd3c12f0fb149963391a28657ca8a51549b80 ['/silly_chatterjee'] [8080, 28015, 28016, 28082]
93ffca099523727e2174e71bf0880e7b0edc3f7aa89279d37688f86061f237d5 ['/confident_wilbur'] [28015, 28016, 28082, 8080]

【讨论】:

  • 嘿,只是好奇,在这种情况下,for 循环是最实用的解决方案吗?我目前的python知识很少,所以不知道我应该为此学习什么其他方法。再次感谢
  • 在大多数情况下,for 循环是迭代某些内容的首选工具。根据经验,我会说:除非您有特定的理由不这样做,否则请使用 for 循环。如果您想更进一步并简化新列表或字典的创建,您可以查看 pythons list comprehension
猜你喜欢
  • 2012-11-21
  • 1970-01-01
  • 2019-05-16
  • 2018-05-16
  • 1970-01-01
  • 1970-01-01
  • 2017-02-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多