对深度嵌套的元组进行排序
Posted
技术标签:
【中文标题】对深度嵌套的元组进行排序【英文标题】:Sort a deeply nested tuple 【发布时间】:2013-12-03 01:54:33 【问题描述】:我有一个嵌套元组列表,如下所示:
l = [('apple', ['gala','fuji', 'macintosh']),
('pear', ['seckel','anjou','bosc'])]
而且我喜欢按字母顺序对元组的第二项进行排序,使其看起来像:
l2 = [('apple', ['fuji','gala', 'macintosh']),
('pear', ['anjou','bosc','seckel'])]
我知道我可以将sorted(l)
应用于它,但我对 Python 非常陌生,并且在迭代时遇到了问题。我该怎么做?
【问题讨论】:
【参考方案1】:类似于以下内容 - 使用列表组合构建新元组...
l = [('apple', ['gala','fuji', 'macintosh']),
('pear', ['seckel','anjou','bosc'])]
l2 = [(k, sorted(v)) for k, v in l]
# [('apple', ['fuji', 'gala', 'macintosh']), ('pear', ['anjou', 'bosc', 'seckel'])]
【讨论】:
【参考方案2】:您可以使用 list.sort()“就地”排序。 这种方法可以节省您的分配,并且您无需触摸按键。
for _,v in l: v.sort()
【讨论】:
我会尽量不去不必要地打开包装,然后做:for i in l: i[1].sort()
哎哟。我不知道这会起作用......它违反了元组的不变性,这很奇怪。其实有点吓人。更新:我想这没关系,有一个列表,你不能在需要不变性的任何地方(例如 dict 键)使用它。需要更新我对“不变性”的假设......
@CorleyBrigman 元组仍然是不可变的......但是,它包含可变对象......有一个明显的区别......例如t = ([1],)
- 你不能像t[0] += [2]
那样做效果是试图改变元组包含的对象,而如果你这样做 t[0].extend([2])
那就没问题了,因为你刚刚改变了底层对象并且元组仍然是一样的......
@JonClements - 是的,这是有道理的。来自 C++,您可以在其中动态“授予”对象的 const 状态(并且对象不一定天生就是可变或不可变的,这是它们或使用它的函数头的声明方式),它是一个不同的模型。只是我要记住的事情。以上是关于对深度嵌套的元组进行排序的主要内容,如果未能解决你的问题,请参考以下文章
如何对返回 orm 对象和自定义列的元组的查询进行正确排序、分组?
用于在 PEP 3113 之后对没有幻数的元组进行排序的 `key` 函数
python 使用 sorted 对 列表嵌套元组的数据进行排序