按第一个键对二维字典排序
我在Python里有一个二维字典,这个字典是用两个IP地址作为索引的。我想根据第一个键来对这个字典进行分组。
比如,之前的样子是这样的:
myDict["182.12.17.50"]["175.12.13.14"] = 14
myDict["182.15.12.30"]["175.12.13.15"] = 10
myDict["182.12.17.50"]["185.23.15.69"] = 30
myDict["182.15.12.30"]["145.33.34.56"] = 230
所以
for key1, key2 in myDict:
print key1 +" " +key2 +" " +myDict[key1, key2]
会打印出
182.12.17.50 175.12.13.14 14
182.15.12.30 175.12.13.15 10
182.12.17.50 185.23.15.69 30
182.15.12.30 145.33.34.56 230
但我想要把它排序,这样打印出来:
182.12.17.50 175.12.13.14 14
182.12.17.50 185.23.15.69 30
182.15.12.30 175.12.13.15 10
182.15.12.30 145.33.34.56 230
有没有什么办法可以做到这一点呢?
5 个回答
0
我想,我对这个问题理解得不是很好。
上面那个字典的输出不是应该是这样的吧:
>>> myDict
{'182.12.17.50': {'185.23.15.69': 30, '175.12.13.14': 14}, '182.15.12.30': {'175.12.13.15': 10, '145.33.34.56': 230}}
然后你可以用OrderedDict来创建一个有序的字典。
1
字典是没有顺序的,但你可以得到一个排序后的项目列表。
>>> sorted((k, sorted(v.items())) for k,v in myDict.items())
[('182.12.17.50', [('175.12.13.14', 14), ('185.23.15.69', 30)]),
('182.15.12.30', [('145.33.34.56', 230), ('175.12.13.15', 10)])]
3
其实有很多种方法可以做到这一点。其中一种方法是在打印之前先对键进行排序,像这样:
for key1 in sorted(myDict):
for key2 in myDict[key1]:
print key1 +" " +key2 +" " +myDict[key1][key2]
另一种选择是使用来自blist模块的 sorteddict 类(顺便说一下,我是这个模块的作者 :)),它会始终以排序好的顺序返回键。
无论哪种方法,由于这些键是IP地址,你可能需要写一个自定义的“键”函数,传递给sort/sorted/sorteddict,这样它们就会根据数字值进行排序,而不是像字符串那样按字典顺序排序。