在python中对嵌套列表进行排序

时间:2012-04-18 11:30:51

标签: python

我有一个嵌套列表:

a = [[{'aa': 2L}, {}, {'mm': 9L}, {}, {}], [{'aa': 1L}, {}, {'mm': 5L}, {}, {}], [{'aa': 2L}, {}, {'mm': 7L}, {}, {}], [{'aa': 5L}, {}, {'mm': 7L}, {}, {}]]

期望的输出:

a = [[{'aa': 1L}, {}, {'mm': 5L}, {}, {}], [{'aa': 2L}, {}, {'mm': 7L}, {}, {}], [{'aa': 5L}, {}, {'mm': 7L}, {}, {}], [{'aa': 2L}, {}, {'mm': 9L}, {}, {}]]

我从a.sort()得到的输出:

a = [[{'aa': 1L}, {}, {'mm': 5L}, {}, {}], [{'aa': 2L}, {}, {'mm': 7L}, {}, {}], [{'aa': 2L}, {}, {'mm': 9L}, {}, {}], [{'aa': 5L}, {}, {'mm': 7L}, {}, {}]]

不希望。

这里我想通过考虑子列表中的任何一个键对列表'a'进行排序。在这种情况下,我使用第三个字典和键'mm'。现在只有一个键'mm'可能是多个键值对,但我应该能够避免其他人,并仅根据'mm'键值进行排序。

2 个答案:

答案 0 :(得分:3)

您有一个列表列表,因此如果要订购子列表,则需要对每个子列表进行排序。

a_sorted = [sorted(sublist) for sublist in a]

显然,如果您希望对外部列表进行排序,则可以在已排序列表列表上运行sorted()

您可以传递sorted()内置一个key参数 - 一个获取列表项并返回值进行排序的函数。有点不清楚你想如何对列表进行排序,你可以澄清一下,尽管如此,你应该能够找到解决方案。

然而,您的数据结构似乎有些奇怪。如果你有{key: value}形式的对,你通常会更好地使用元组:(key, value),或者包含所有对作为键和值的单个较大的dict,例如:

a = [{'aa': 2L, 'mm': 7l}, {'aa': 2L, 'mm': 5L}, {'aa': 2L, 'mm': 9L}, {'aa': 2L, 'mm': 3L}]

在这种情况下,我们可以使用sorted(a, key=itemgetter("mm")) - 使用operator.itemgetter() - 对'mm'的值进行排序。

或者,如果您需要空对(例如,不使用None的键),则为元组:

a = [[('aa', 2L), (,), ('mm', 7L), (,), (,)], [('aa', 2L), (,), ('mm', 5L), (,), (,)], [('aa', 2L), (,), ('mm', 9L), (,), (,)], [('aa', 2L), (,), ('mm', 3L), (,), (,)]]

在这里我们可以做类似的事情sorted(a, key=lambda sublist: sublist[2][1]) - 我们使用lambda来创建一个快速函数来提取子列表中第三项的第二项。

如果您希望保持数据结构不变 - 例如,如果您计划扩展包含更多内容的词典,那么类似的计划将有效sorted(a, key=lambda sublist: sublist[2]["mm"]) - 这次使用'mm'来访问dict

答案 1 :(得分:2)

我不确定我是否正确地提出了问题,但答案对我来说似乎很简单,如下所示。

索引键中的第三项[3],然后使用键mm重新索引字典

>>> sorted(a,key=lambda key:key[2]['mm'])
[[{'aa': 1L}, {}, {'mm': 5L}, {}, {}], [{'aa': 2L}, {}, {'mm': 7L}, {}, {}], [{'aa': 5L}, {}, {'mm': 7L}, {}, {}], [{'aa': 2L}, {}, {'mm': 9L}, {}, {}]]
>>>