【问题标题】:Sort a list that contains both strings and integers (Python)对同时包含字符串和整数的列表进行排序 (Python)
【发布时间】:2022-01-11 04:46:48
【问题描述】:

我想对包含(字符串、整数、整数)的元组列表进行排序。这些元组的第一个值可以是任何字符串(例如 '$',或数字字符串,例如 '9')。目标是根据这些元组的第一个元素进行排序,如果比较发生在两个相同的字符串之间,我根据第二个元素进行排序。我尝试了以下方法,但结果不成功。解决方案?

array = [('$', 0, 0), ('3', 3, 3), ('7', 5, 6), ('15', 6, 9), ('5', 7, 11), ('17', 8, 13), ('18', 9, 16), ('19', 10, 18), ('16', 11, 20)]
sorted_array = sorted(array, key=lambda x:(x[0], int(x[1])))
print(sorted_array)

输出:

[('$', 0, 0), ('3', 3, 3), ('7', 5, 6), ('15', 6, 9), ('5', 7, 11), ('17', 8, 13), ('18', 9, 16), ('19', 10, 18), ('16', 11, 20)]

我想得到:

[('$', 0, 0), ('3', 3, 3), ('5', 7, 11), ('7', 5, 6), ('15', 6, 9), ('16', 11, 20), ('17', 8, 13), ('18', 9, 16), ('19', 10, 18)]

【问题讨论】:

  • 字符串比较不能这样工作:stackoverflow.com/a/4806946/13111190 你必须为键定义一个更复杂的函数。
  • 你的规则是什么?您可以使用natsort.natsorted'7' 排序在'15' 之前,但这会将$ 推到最后。
  • 我想要一个排序,它根据字符串的字典顺序和数字字符串的数字顺序对字符串进行排序。 @mozway
  • 然后检查我的答案,可能是你想要的;)

标签: python list sorting


【解决方案1】:

使用natsort(自然排序)和str.isdigit,您可以对数字进行自然排序,同时保留非数字优先。但您可能期望的更一般的规则尚不清楚。

from natsort import natsorted 

array = [('$', 0, 0), ('3', 3, 3), ('7', 5, 6), ('15', 6, 9), ('5', 7, 11), ('17', 8, 13), ('18', 9, 16), ('19', 10, 18), ('16', 11, 20)]
sorted_array = natsorted(array, key=lambda x:(x[0].isdigit(), x))
print(sorted_array)

输出:

[('$', 0, 0), ('3', 3, 3), ('5', 7, 11), ('7', 5, 6), ('15', 6, 9), ('16', 11, 20), ('17', 8, 13), ('18', 9, 16), ('19', 10, 18)]

【讨论】:

    【解决方案2】:

    如果您在排序键中正确对齐字符串组件,则可以通过常规排序获得该结果。

    array = [('$', 0, 0), ('3', 3, 3), ('7', 5, 6), ('15', 6, 9), 
             ('5', 7, 11), ('17', 8, 13), ('18', 9, 16), ('19', 10, 18), 
             ('16', 11, 20)]
    
    sorted_array = sorted(array,key=lambda x:(x[0].rjust(15),x[1:]))
    
    print(sorted_array)
    [('$', 0, 0), ('3', 3, 3), ('5', 7, 11), ('7', 5, 6), ('15', 6, 9), 
     ('16', 11, 20), ('17', 8, 13), ('18', 9, 16), ('19', 10, 18)]
    

    【讨论】:

    • 这是一个不错的技巧 (+1),但您需要估计要评估的数字的上限。生成字符串也会增加额外的成本。 ;)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-06-27
    • 1970-01-01
    • 2021-08-12
    • 2014-06-21
    • 2016-01-23
    • 2022-12-10
    相关资源
    最近更新 更多