【问题标题】:Sorting a tuple that contains lists对包含列表的元组进行排序
【发布时间】:2010-10-29 08:48:58
【问题描述】:

我有一个与this one 类似的问题,但我的元组包含列表,如下所示:

mytuple = (
 ["tomato", 3],
 ["say", 2],
 ["say", 5],
 ["I", 4],
 ["you", 1],
 ["tomato", 6],
)

最有效的排序方式是什么?

【问题讨论】:

  • 您要按哪个字段排序?
  • 您不能对元组进行排序。它是不可变的。
  • 在这种情况下,从语义上讲,元组甚至没有意义。一般来说,对元组进行排序没有任何意义,因为应该使用列表。

标签: python list sorting tuples


【解决方案1】:

不幸的是,您将不得不实例化一个新元组:类似于

mytuple = sorted(mytuple)

应该可以解决问题。不过,sorted 不会返回元组。如果需要,请在 tuple() 中进行通话。如果数据集很长,这可能代价高昂。

如果需要设置子列表中的第二个元素,可以使用key 参数到sorted 函数。为此,您需要一个辅助函数:

mytuple = sorted(mytuple, key=lambda row: row[1])

【讨论】:

    【解决方案2】:

    该问题的公认答案中使用的技术 (sorted(..., key=itemgetter(...))) 应该适用于任何此类迭代。根据您在此处提供的数据,我认为那里提供的确切解决方案就是您想要的。

    【讨论】:

      【解决方案3】:

      你可以很容易地得到一个排序的元组:

      >>> sorted(mytuple)
      [['I', 4], ['say', 2], ['say', 5], ['tomato', 3], ['tomato', 6], ['you', 1]]
      

      这将根据列表中的项目进行排序。如果前两个匹配,则比较第二个,依此类推。

      如果您有不同的标准,可以提供比较功能。

      更新:正如评论者所说,这会返回一个列表。你可以像这样得到另一个元组:

      >>> tuple(sorted(mytuple))
      (['I', 4], ['say', 2], ['say', 5], ['tomato', 3], ['tomato', 6], ['you', 1])
      

      【讨论】:

      • “获取排序的元组”是指“创建一个排序的新元组”吗?
      • 然而,这非常低效 - 为什么不听从 mluebke 的建议并从列表开始呢? S. Lott 是对的——你不能就地对元组进行排序。
      • 我正在尝试处理 psycopg2 的输出,它使用 Python 的 DB-API 并因此输出元组。
      • DB-API .fetch 函数通常返回元组(记录)的列表(行),而不是列表的元组。请提供示例代码和数据。
      【解决方案4】:

      您不能对元组进行排序。

      你可以做的是使用sorted(),它不会对元组进行排序,但会从你的元组创建一个排序列表。如果你真的需要一个排序的元组,那么你可以将 sorted 的返回值转换为一个元组:

      mytuple = tuple(sorted(mytuple, key=lambda row: row[1]))
      

      这可能会浪费内存,因为您正在创建一个列表然后丢弃它(同时也丢弃原始元组)。您可能不需要元组。从列表开始并对其进行排序会更有效。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2010-09-18
        • 2018-03-15
        • 2012-07-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-04-06
        • 2018-08-17
        相关资源
        最近更新 更多