【问题标题】:Using lambda sort function to sort a tuple of strings by each tuples combined value使用 lambda 排序函数按每个元组组合值对字符串元组进行排序
【发布时间】:2019-09-05 10:54:37
【问题描述】:

我有一个元组列表,其中每个元组(a,b) 代表对象 a*b 的高度:

L = [("3m", "5cm"), ("10m", "77cm"), ("1m", "82cm"), ("1m", "74cm"), ("11m", "50cm")] 

现在,我想使用 lambda 排序函数根据高度对这个列表进行排序。输出应该如下所示:

L = [("1m", "74cm"), ("1m", "82cm"), ("3m", "5cm"), ("10m", "77cm"), ("11m", "50cm")]

以下是我尝试过的,但出现错误:

L.sort(key= lambda x: 100 * int(x[0][0:-2]) + int(x[1][0:-3])) 

如何解决?

【问题讨论】:

    标签: python sorting lambda tuples


    【解决方案1】:

    您的切片索引已关闭;结束索引是独占的,因此您想分别对索引-1-2 进行切片,从而实现:

    L.sort(key=lambda x: 100 * int(x[0][:-1]) + int(x[1][:-2])) 
    

    我还省略了起始索引(因为对于正向切片它默认为零)。另一种解决方案是rstrip,这样您就不会使用幻数执行显式切片:

    L.sort(key=lambda x: 100 * int(x[0].rstrip('m')) + int(x[1].rstrip('cm'))) 
    

    请注意,rstrip 将删除 runs 任何提供的字符,因此如果您的值不是以预期的 mcm 结尾,这可能会出现问题,但是那么,魔法切片会更频繁地默默地行为不端,所以这仍然是一个改进。

    【讨论】:

      【解决方案2】:

      您的错误是由于对字符串的不正确切片造成的。将这些问题分解成更小的部分总是有用的。切片第一个字符串时:

      print(L[0][0][0:-2])
      ''
      

      这将返回一个空字符串。按照您的符号,它实际上应该是L[0][0][0:-1],可以简化为L[0][0][:-1]。这是因为使用 python 切片符号a[start:stop],切片的最后一个元素不包括在内。我建议您查看this post,以便您更好地了解切片符号的工作原理。所以你需要:

      sorted(L, key = lambda x: int(x[0][:-1])*100 + int(x[1][:-2]))
      
      [('1m', '74cm'),
       ('1m', '82cm'),
       ('3m', '5cm'),
       ('10m', '77cm'),
       ('11m', '50cm')]
      

      【讨论】:

        【解决方案3】:

        使用replacemcm 或任何姊妹方法,如.strip("cm")

         L.sort(key= lambda x: 100 * int(x[0].replace('m','')) + int(x[1].replace('cm','')))
        

        【讨论】:

        • 负索引不需要知道长度;它很脆弱,但如果输入可靠地仅以 mcm 结尾并且结束索引是固定的,它会起作用。
        【解决方案4】:

        您不需要将每个元组转换为单个整数;一个整数元组就足够了(唉,假设你没有像 ("1m", "105cm") 这样的奇怪高度)。

        L.sort(key=lambda x: (int(x[0].strip("cm")), int(x[1].strip("cm"))))
        

        列表的排序方式与元组相同,因此您可以使用列表推导来简化这一点。

        L.sort(key=lambda p: [int(x.strip("cm")) for x in p])
        

        元组和列表都按字典顺序进行比较:一次一个元素,第一对不相等的元素决定结果。

        【讨论】:

        • 我没想到会这样;可能是基于必须发生多少名称查找的实现细节。
        • 我的错,恰恰相反。转换为整数比使用列表推导大约快 0.000023 秒。不过,我仍然感谢您的解释,元组和列表如何比较。
        猜你喜欢
        • 2017-08-21
        • 1970-01-01
        • 1970-01-01
        • 2013-12-03
        • 1970-01-01
        • 1970-01-01
        • 2017-05-25
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多