【发布时间】:2017-08-20 16:52:43
【问题描述】:
我有一个包含字符串表示的数字的列表:
nums = [['1','3'],['2','2'],['1','2'],['0','2'],['11','2']]
我需要在不修改原始列表中数字的字符串表示的情况下,按第一个然后第二个条目对这些数字升序进行排序。另外,要避免创建另一个列表的第二个副本,其中所有内容都明确映射到整数——想象一下这是一个巨大的列表。
sort() 和 sorted() 都适用于元组和列表,因此使用 lambda 键,我可以执行以下操作:
>>> sorted(nums, key=lambda n: (int(n[0]),int(n[1]))
[['0', '2'], ['1', '2'], ['1', '3'], ['2', '2'], ['11', '2']]
快乐的日子...
但是,我看到许多关于使用 operator.itemgetter() 作为关键函数而不是使用 lambda 进行排序的帖子。 在不讨论这些声明的有效性的情况下,是否有人可以在使用 operator.itemgetter() 时应用从字符串到整数的转换以进行比较:
以下显然失败,因为字符串被比较为字符串,而不是数字:
>>> sorted(nums, key=operator.itemgetter(0,1))
[['0', '2'], ['1', '2'], ['1', '3'], ['11', '2'], ['2', '2']]
【问题讨论】:
-
Yeeesssss.... 但它会比等效的幼稚 lambda 长得多。
-
itemgetter如果您要获得所有项,则不是很有用。 -
您调用了列表
nums,但它不包含任何数字,仅包含列表和字符串。除非排序是这些字符串的数值唯一重要并且它们在所有其他时间都需要是字符串,否则您可以将它们转换为原始列表中的整数,然后您不需要传递排序键。跨度> -
@TigerhawkT3 忘了添加那个细节,很好。我无法修改现有列表——它们需要保留字符串。只希望它们像整数一样排序。更新问题文本以澄清这一点。
-
包含表示数字的字符串的列表是一个奇怪的数据。数据何时/何地进入您的应用程序时转换为数字。
标签: python python-3.x sorting lambda