【问题标题】:Parsing dictionary and grouping output with Python使用 Python 解析字典和分组输出
【发布时间】:2016-11-04 15:23:23
【问题描述】:

假设我有一个

dictionary = {
              'host_type' : {'public_ip':['ip_address','ip_address','ip_address'], 
                             'private_dns':['dns_name','dns_name','dns_name']} 
              }

有一些主机类型,假设有3种主机类型:主,从,备份

字典的输出可以包含每种主机类型的不同数量的主机。例如,对于 2 个 master、6 个 slave、2 个备份,字典看起来像这样:

dictionary = 
   {
    'master' : {
                'public_ip':['ip_address','ip_address'], 
                'private_dns': ['dns_name','dns_name']
               },
    'slave' : {
               'public_ip':['ip_address','ip_address', 'ip_address','ip_address','ip_address','ip_address'], 
               'private_dns': ['dns_name','dns_name','dns_name','dns_name','dns_name','dns_name']
              },
    'backup' : {
                'public_ip':['ip_address','ip_address'],
                'private_dns':['dns_name','dns_name']
               }
    }

现在我想解析字典并对主机进行分组,这样我总是有 1 个主设备、1 个备份设备和 3 个从设备。我怎样才能解析这样的字典来达到类似的效果:

master,public_ip,private_dns
backup,public_ip,private_dns
slave,public_ip,private_dns
slave,public_ip,private_dns
slave,public_ip,private_dns

master,public_ip,private_dns
backup,public_ip,private_dns
slave,public_ip,private_dns
slave,public_ip,private_dns
slave,public_ip,private_dns

【问题讨论】:

  • 我尝试了一个 grouper 函数,所以我得到了以下形式的输出:(public_ip, private_dns) 但我仍然需要按 1master,1backup,3slaves 对它进行分组
  • 我不需要一个确切的答案,但可能需要一个提示,让我朝着正确的方向前进。

标签: python dictionary grouping


【解决方案1】:
d = {
'master' : {
            'public_ip':['ip_address0M','ip_address1M'], 
            'private_dns': ['dns_name','dns_name']
           },
'slave' : {
           'public_ip':['ip_address0s','ip_address1s', 'ip_address2s','ip_address3s','ip_address4s','ip_address5s'], 
           'private_dns': ['dns_name','dns_name','dns_name','dns_name','dns_name','dns_name']
          },
'backup' : {
            'public_ip':['ip_address0b','ip_address1b'],
            'private_dns':['dns_name','dns_name']
           }
}


masterCount = 0
slavecount = 0
backupCount = 0

result = list()

while(masterCount + 1 <= len(d['master']['public_ip']) and slavecount + 3 <= len(d['slave']['public_ip']) and backupCount + 1 <= len(d['backup']['public_ip'])):
    result.append([])
    tempList = [d['master']['public_ip'][masterCount], d['slave']['public_ip'][slavecount:slavecount+3], d['backup']['public_ip'][backupCount]]
    result[masterCount].append(tempList)
    masterCount+=1
    slavecount+=3
    backupCount==1

print(result)

现在结果的格式为:

  1. result[index][0] 是 master
  2. 结果[索引][1] 是从属
  3. 结果[索引][2] 是备份

[编辑] 您可以执行类似的操作来添加 DNS。我没有添加它,因为你提到你只想要方向。

输出:

[[['ip_address0M', ['ip_address0s', 'ip_address1s', 'ip_address2s'], 'ip_address0b']], [['ip_address1M', ['ip_address3s', 'ip_address4s', 'ip_address5s'], 'ip_address0b']]]

【讨论】:

  • 嘿!感谢你的回答。我做的有点不同,但你的回答让我走上了正轨。谢谢。我同意它作为答案
  • 谢谢。很高兴我能帮上忙。
【解决方案2】:
m1 = d['master']['public']
m2 = d['master']['private']
b1 = d['backup']['public']
b2 = d['backup']['private']
s1 = d['slave']['public']
s2 = d['slave']['private']

zip(zip(m1, m2), zip(b1, b2), zip(*[iter(zip(s1, s2))]*3))

解决字典中的所有列表可能有更好的解决方案,但这应该可以。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-11-24
    • 1970-01-01
    • 1970-01-01
    • 2021-07-28
    • 2019-01-18
    • 1970-01-01
    • 2017-07-06
    • 2013-08-09
    相关资源
    最近更新 更多