0

我有一个嵌套列表:

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”键值进行排序。

4

2 回答 2

3

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

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

显然,如果您希望外部列表也被排序,您可以sorted()在排序列表的列表上运行。

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

但是,您的数据结构似乎有点奇怪。如果您有对形式的对,{key: value}通常最好使用元组:(key, value),或者一个包含所有对作为键和值的单个更大的字典,例如:

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

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

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

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.

于 2012-04-18T11:32:28.223 回答
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}, {}, {}]]
>>> 
于 2012-04-18T11:54:34.250 回答