2010-09-23 36 views
1

我有一个Python字典中的二维字典,由两个IP索引。我想按第一个键将字典分组。Python通过第一键排序二维字典

例如,之前是这样的:

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 

任何想法如何实现?

+0

你能举一个你想要输出的真实例子吗?你给“排序后”的例子是赋值语句,你可以按照你想要的顺序放入。 – 2010-09-23 18:50:39

+0

@Daniel,赋值语句的意思就是如果你在for循环中运行它,它将如何打印,添加更多的澄清。 – 2010-09-23 19:35:44

回答

2

那么,有各种选择。其中之一是将按键打印之前,这样的排序:

for key1 in sorted(myDict): 
    for key2 in myDict[key1]: 
     print key1 +" " +key2 +" " +myDict[key1][key2] 

另一种选择是使用sorteddict类从blist模块(声明:我是作者:)),这将始终按排序顺序返回键。

无论哪种情况,由于密钥都是IP地址,因此您可能希望编写一个自定义“密钥”函数来传递sort/sorted/sorteddict,以便按照它们的数值进行排序,而不是按字典顺序排列为字符串。

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)])] 
0

字典是一种无序的类型,在你的例子中,我没有看到你想要字典命令的原因。

如果你需要创建一个有序的系列字典的内容,即它的项目,你可以做到这一点简单地通过应用sorted

# Returns sorted list of item tuples 
sorted(myDict.iteritems()) 

或检查出OrderedDict如果你的Python版本支持它,你知道什么意思,有一个分类字典。