0

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

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

排序这个最有效的方法是什么?

4

4 回答 4

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])
于 2009-05-27T18:16:04.380 回答
5

您不能对元组进行排序。

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

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

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

于 2009-05-27T19:38:07.350 回答
1

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

mytuple = sorted(mytuple)

应该做的伎俩。 sorted但是,不会返回元组。tuple()如果你需要的话,把电话打进去。如果数据集很长,这可能代价高昂。

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

mytuple = sorted(mytuple, key=lambda row: row[1])
于 2009-05-27T18:13:59.627 回答
1

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

于 2009-05-27T18:14:09.330 回答