我有一个与此类似的问题,但我的元组包含列表,如下所示:
mytuple = (
["tomato", 3],
["say", 2],
["say", 5],
["I", 4],
["you", 1],
["tomato", 6],
)
排序这个最有效的方法是什么?
你可以很容易地得到一个排序的元组:
>>> 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])
您不能对元组进行排序。
您可以做的是使用sorted(),它不会对元组进行排序,但会从您的元组创建一个排序列表。如果你真的需要一个排序的元组,你可以将 sorted 的返回值转换为一个元组:
mytuple = tuple(sorted(mytuple, key=lambda row: row[1]))
这可能会浪费内存,因为您正在创建一个列表然后将其丢弃(同时也丢弃原始元组)。您可能不需要元组。从列表开始并对其进行排序会更有效。
不幸的是,您将不得不实例化一个新元组:类似于
mytuple = sorted(mytuple)
应该做的伎俩。 sorted
但是,不会返回元组。tuple()
如果你需要的话,把电话打进去。如果数据集很长,这可能代价高昂。
如果需要设置子列表中的第二个元素,可以使用函数的key
参数sorted
。为此,您需要一个辅助函数:
mytuple = sorted(mytuple, key=lambda row: row[1])
该问题的公认答案中使用的技术 ( sorted(..., key=itemgetter(...))
) 应该适用于任何此类迭代。根据您在此处提供的数据,我认为那里提供的确切解决方案就是您想要的。