Python用第一键排序二维字典

时间:2010-09-23 18:45:50

标签: python sorting dictionary

我在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 :(得分:3)

嗯,有各种各样的选择。其中之一就是在打印前对键进行排序,如下所示:

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

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

在任何一种情况下,由于密钥是IP地址,您可能希望编写自定义“密钥”函数以传递给sort / sorted / sorteddict,以便它们按数字值排序,而不是按字典顺序排序为字符串。

答案 1 :(得分:1)

Dicts没有订单,但你可以得到的是一个排序的项目列表。

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

答案 2 :(得分:0)

您可以将自定义比较功能传递给Sorted。 http://docs.python.org/library/functions.html#sorted

有了它,您可以指定要比较的键和方式。

答案 3 :(得分: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创建排序字典。

答案 4 :(得分:0)

字典是一种无序类型,在您的示例中,我没有看到您希望订购该字典的原因。

如果您需要创建字典内容的有序系列,即其项目,您可以通过应用sorted来实现:

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

如果您的Python版本支持它,请查看OrderedDict,并了解具有排序字典的含义。