对深度嵌套的元组进行排序

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 对 列表嵌套元组的数据进行排序

使用 Flow 对 React 中深度嵌套的 props 进行类型检查

从 Sqlite 表中选择行的元组并有效地对元组进行排序