1

我有一段时间试图为我正在编写的处理不同 IP 地址的脚本创建字典。

我的问题是这样的:

给定d1and d2,并假设d1andd2将始终具有相同数量的 key:pair 项目,我该如何创建d3

d1 = {1:a, 2:b, 3:b, 4:c, 5:c}

d2 = {one:a, two:b, three:b, four:c, five:c}

d3 = {a:[{1:one}], b:[{2:two},{3:three}], c:[{4:four},{5:five}]}

您可以看到包含与和d3中的值相同的键,并且对于 中的每个键,它都有一个列表的值,其中有更多的字典,其键:对值对应于 和 的原始键。d1d2d3d1d2

我一直在尝试创作d3一段时间,但我似乎无法推理出如何去做。非常感谢您的帮助!

4

2 回答 2

1

给出答案之前的第一个提示:

reverse_d1 = {}
for k, v in d1.iteritems():
  reverse_d1.set_default(v, []).append(k)
于 2013-09-26T14:23:28.413 回答
0

所有,谢谢你的意见。对此,我真的非常感激。不幸的是,我意识到我目前提出问题的方式是完全无效的。d2 中的键对应于子网掩码,它们并不都是唯一的,所以我构造它的方式甚至不是一个有效的字典。

经过一番大惊小怪,我想出了一个可行的解决方案:

p = 0
sysNames = ['R3','R2','R1']
d1 = OrderedDict([('200.200.200.2','R3'),('200.200.200.1','R2'),('172.172.172.1','R2'),('172.172.172.100','R1'),('192.168.1.151','R1')])

oid1 = '1.3.6.1.2.1.4.20.1.3.200.200.200.2'
oid2 = '1.3.6.1.2.1.4.20.1.3.200.200.200.1'
oid3 = '1.3.6.1.2.1.4.20.1.3.172.172.172.1'
oid4 = '1.3.6.1.2.1.4.20.1.3.172.172.172.100'
oid5 = '1.3.6.1.2.1.4.20.1.3.192.168.1.151'

d2 = {oid1:'255.255.255.0',oid2:'255.255.255.0',oid3:'255.255.255.0',oid4:'255.255.255.0',oid5:'255.255.255.0'}

d1keys = list(d1.keys())
d1values = list(d1.values())
maskOid = '1.3.6.1.2.1.4.20.1.3.'

d3 = {}

for i in range(len(sysNames)):
    ipMaskList = list()
    numInterfaces = d1values.count(sysNames[i])

    for dummy in range(numInterfaces):
        ipMaskList.append({d1keys[p]:d2.get(maskOid+d1keys[p])})
        p += 1

    d3[sysNames[i]] = ipMaskList

作为典型,我确信这是一种非常低效且令人费解的方式来实现我的目标。我绝对不是一个伟大的程序员,当事情正常运行时我很高兴。

再次感谢你们的帮助,如果有人想发布更有效的解决方案,请随时:)

于 2013-09-26T21:09:26.190 回答