对包含列表的元组进行排序

时间:2009-05-27 18:09:44

标签: python list sorting tuples

我对this one提出了类似的问题,但我的元组包含列表,如下所示:

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

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

4 个答案:

答案 0 :(得分:7)

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

>>> 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])

答案 1 :(得分:5)

你无法对元组进行排序。

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

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

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

答案 2 :(得分:1)

不幸的是,你必须实例化一个新的元组:类似

mytuple = sorted(mytuple)

应该做的伎俩。但是,sorted不会返回元组。如果您需要,请将呼叫包裹在tuple()中。如果数据集很长,这可能会很昂贵。

如果您需要设置子列表中的第二个元素,则可以使用key参数加sorted函数。你需要一个帮助函数:

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

答案 3 :(得分:1)

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