按第一个键对二维字典排序

2 投票
5 回答
4285 浏览
提问于 2025-04-16 04:31

我在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,这样它们就会根据数字值进行排序,而不是像字符串那样按字典顺序排序。

撰写回答