python按内部列表列表排序字典

时间:2012-11-20 20:34:29

标签: python sorting

我正在使用Python 2.5。我有一个字典,列表列表为值

{'a': [['6', 3]], 'b': [['5', 1], ['6', 5]], 'c': [['446', 2],['6', 11],['67', 86]] }

我想通过第一个列表项的第二个元素对它进行排序,因此,上面的内容将按如下方式排序:

'b': [['5', 1], ['6', 5]], 
'c': [['446', 2],['6', 11],['67', 86]]
'a': [['6', 3]]

有什么建议吗?

由于 斯科特

2 个答案:

答案 0 :(得分:4)

字典本身是无序的,因此您无法对其进行排序。如果要创建键值对的排序列表,可以这样做:

sorted(myDict.iteritems(), key=lambda x: x[1][0][1])

iteritems返回一个(key,value)对的迭代,所以x[1][0][1]表示“取这一对的第二个元素(这是值),然后取第一个元素(这是列表列表中的第一个列表)并取第二个元素 - 按顺序,第一个列表中的第二个元素,这就是你想要的。

答案 1 :(得分:1)

字典没有订单。

但是,标准库中有一个名为collections.OrderedDict的类,它保留了插入顺序。你可以创建一个这样的:

>>> collections.OrderedDict(sorted(myDict.iteritems(), key=lambda x: x[1][0][1])
OrderedDict([('b', [['5', 1], ['6', 5]]), ('c', [['446', 2], ['6', 11], ['67', 86]]), ('a', [['5', 4]])])

myDict.iteritems()会返回(key, value) tuple的序列。 (您也可以使用items,它将序列作为列表而不是迭代器返回 - 但它将在Python 3中起作用,iteritems不会。)

sortedkey对其进行排序。

key是一个函数,它从这些value中的一个tuple获取value,该OrderedDict的第二个元素和第二个元素的第一个元素,这是你想要排序的。

Python 2.5中不存在{{1}}类,但它是用纯Python实现的。如果您查看the docs获取2.7,则会显示the code的链接,您可以将其复制并粘贴到2.5程序中。或者您可以使用借用到标准库中的ActiveState配方,或者在PyPI中查找为您执行此操作的模块。