我有一个嵌套列表:
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'键值进行排序。
答案 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}, {}, {}]]
>>>