【问题标题】:Sorting list by value of division按除法值排序列表
【发布时间】:2013-07-08 06:42:31
【问题描述】:

我正在尝试学习 Python,但遇到了这样的问题。

我有一个清单:

a = [[10,5],[9,3],[16,2],[8,8]]

我想得到一个列表,该列表将按 divion arr[i][0]/arr[i][1] 的值进行降序排序。例如对于我想要的列表(排序后):

a =[[8,8],[10,5],[9,3],[16,2]]

我尝试在 a.sort(key = lambda .....) 中使用 lambda,但失败了。

你能帮我理解它是怎么回事吗?

【问题讨论】:

    标签: python list sorting lambda key


    【解决方案1】:

    sorted()key 一起使用,例如:

    >>> a = [[10,5],[9,3],[16,2],[8,8]]
    >>> sorted(a, key= lambda x: x[0]/x[1])
    [[8, 8], [10, 5], [9, 3], [16, 2]]
    

    来自文档,

    key specifies a function of one argument that is used to extract a comparison key from each list element
    

    这里,lambda 函数返回第一个元素除以第二个元素的结果

    lambda x: x[0]/x[1]
    

    【讨论】:

    • 我在读这个:wiki.python.org/moin/HowTo/Sorting 但可能错过了。谢谢!
    • 讲的是Key函数,就是我们这里使用的,lambda获取列表中的每个元素如[10, 5][9, 3]等,并返回用于排序的除法列表。
    【解决方案2】:

    您没有说您使用的是 Python2 还是 Python3。在 Python2 中,您需要确保它是浮点除法

    >>> a = [[10,5],[9,3],[16,2],[8,8]]
    >>> sorted(a, key=lambda x: float(x[0]) / x[1])
    [[8, 8], [10, 5], [9, 3], [16, 2]]
    

    如果有机会除以 0,你需要这样的东西

    >>> sorted(a, key= lambda x: float(x[0])/x[1] if x[1] else float('inf'))>>> from 
    

    另一种方法是使用Fraction,它可以避免float 的精度问题。不幸的是,Fraction 不适用于 2.4

    fractions import Fraction
    >>> sorted(a, key=lambda x:Fraction(*x))
    [[8, 8], [10, 5], [9, 3], [16, 2]]
    

    【讨论】:

    • Python 2.4。没有机会除以 0,但我完全忘记了 float()。 from future 导入除法是否也有助于 lambda 函数的正确除法?
    • @geluinie,当然from __future__ import division 也可以使用
    猜你喜欢
    • 1970-01-01
    • 2012-05-29
    • 2010-10-26
    • 2021-01-24
    • 2012-06-27
    • 2015-01-11
    • 2018-11-03
    • 2014-08-20
    • 1970-01-01
    相关资源
    最近更新 更多