【问题标题】:trying to understand sort(key = ...) function试图理解 sort(key = ...) 函数
【发布时间】:2020-10-19 17:20:30
【问题描述】:

我有以下清单:

employees = [
    {'Name': Allan, 'Age': 25, 'Salary': 10000},
    {'Name': Sharon, 'Age': 30, 'Salary': 8000},
    {'Name': John, 'Age': 18, 'Salary': 1000} 
]

我想通过将“名称”键作为参考来对该列表进行排序。为此,我一直在研究的来源提供了以下功能:

def get_name(employee):
    return employee.get('Name')

employees.sort(key = get_name)

如果我现在运行 print(employees),它会根据需要对字典进行分类。

我的问题是,解释器如何理解,参数'employee'是什么?它没有定义,实际上与“员工”列表无关。这让我有点困惑。

如果有人解释,我将不胜感激。谢谢!

【问题讨论】:

  • 你知道get_name(employees[0]) 会做什么吗? (如果不试一试!)
  • employee 是调用 get_name() 的任何参数。它在该功能之外没有任何意义。

标签: python sorting dictionary


【解决方案1】:

sort 定义了它将如何处理keysort 期望 key 是一个 callable(即函数),它将调用并将列表中的一个元素传递给它。 sort 将为列表中的每个元素调用 key。您传递的函数 (get_name) 必须与此定义匹配,而不是相反。

def get_name(employee) 中的employee 是任意参数名称。你定义函数,你可以为你的参数命名任何你想要的名字。

【讨论】:

    【解决方案2】:

    employee 是代码作者为函数get_name 的参数命名的名称,选择它可能是为了使与外部结构的关系更清晰。你可以用任何有效的变量名替换函数中的employee(在两个地方),它的工作原理是一样的:

    def get_name(my_dict):
        return my_dict.get('Name')
    

    【讨论】:

      【解决方案3】:

      参数employee只是给get_name函数的变量名;您可以将其更改为 foo 或其他任何内容,只要您在函数体中也进行了更改,它仍然可以工作。

      至于解释器如何知道employee 是什么:Python 是duck typed。您可以在get_name 函数中放入一个完全不同类型的变量,只要它有一个可以接受'Name' 参数的get 方法,它也可以正常工作。

      【讨论】:

        【解决方案4】:

        首先,你必须把名字放在引号中,否则在python中是非法的。

        那么也许这样会更容易理解:

        >>> employees = [
        ...     {'Name': 'Allan', 'Age': 25, 'Salary': 10000},
        ...     {'Name': 'Sharon', 'Age': 30, 'Salary': 8000},
        ...     {'Name': 'John', 'Age': 18, 'Salary': 1000} 
        ... ]
        >>> 
        >>> sorted( employees, key = lambda x : x['Name'] )
        [
            {'Salary': 10000, 'Age': 25, 'Name': 'Allan'},
            {'Salary': 1000, 'Age': 18, 'Name': 'John'},
            {'Salary': 8000, 'Age': 30, 'Name': 'Sharon'}
        ]
        

        请注意,我不使用任何外部函数,只使用 lambda,它没有名称,只有一个参数(在我们的例子中为 x),这是您列表中的项目之一,它返回key 将根据该列表对列表进行排序。您可以尝试返回x['Salary']x['Age'] 并查看结果。 get_name 这个名字比较偶然,完全没有影响。使用 lambdas 实际上要容易得多。

        【讨论】:

          猜你喜欢
          • 2018-05-18
          • 1970-01-01
          • 1970-01-01
          • 2015-03-23
          • 1970-01-01
          • 1970-01-01
          • 2020-10-20
          • 1970-01-01
          • 2013-07-07
          相关资源
          最近更新 更多