【问题标题】:Can lambda be used instead of a method, as a key in sorted()?可以使用 lambda 代替方法,作为 sorted() 中的键吗?
【发布时间】:2016-09-22 11:30:41
【问题描述】:

这是我第一次提问。我已经从你那里得到了很多帮助,甚至没有问。 (感激的脸)。 所以,几周前我从这里找到了这段有用的代码。

import re

def yearly_sort(value):
    numbers = re.compile(r'(\d+)')
    parts = numbers.split(value)
    parts[1::2] = map(int, parts[1::2])
    return parts

在这里完美运行:

def get_files_sorted(path_to_dir):
   file_names = []
   for root, dirs, files in os.walk(path_to_dir):
      for file_name in sorted(files, key=yearly_sort):
         file_names.append(os.path.join(root, file_name))
   return file_names

现在,我遇到了描述上述函数的问题(正如您已经从非描述性方法名称中看到的那样)。

上述方法的名称应该是什么(而不是 some_sort())?

这个方法可以在 lambda 中以某种方式压缩,使得 sorted() 中的 key 可以绑定到 key=lambda?

【问题讨论】:

  • 为什么你觉得需要用 lambda 替换它?你了解lambda 的工作原理吗?
  • 社区你好!
  • 你能把函数yearly_sort写成lambda函数吗
  • @IgnacioVazquez-Abrams 在我看来它不适合一种方法。我的团队对描述性命名非常严格,我无法正确描述它。是的,我确实了解 lambda 是如何工作的,但是对这个了解不够。
  • 当编码指南诱使程序员跳槽(并使代码更加神秘)以逃避添加简单函数时...

标签: python python-3.x lambda


【解决方案1】:

绝对可以是lambda函数。例如看question

但是如果你有复杂的函数,你永远不应该把它移到lambda,因为可读性会显着降低。

所以这里是Zen of Python

复杂胜于复杂。

【讨论】:

    【解决方案2】:

    如果 numbers 之前已编译(这会提高性能),您可以将其压缩到 lambda 中

    numbers = re.compile(r'(\d+)')
    for file_name in sorted(files, key=lambda value : [int(x) if x.isdigit() else 0 for x in numbers.split(value)][1::2]):
    

    在这种情况下,我们会从 #0 和 #3 开始进行不必要的测试。也许它可能会更好,但这就是复杂 lambdas 的风险:性能和易读性可能会受到影响。

    【讨论】:

    • for file_name in sorted(files, key=lambda name: [ int(numbers.split(name)[1]) ]): 可以用这个代替吗?
    • 如果它做同样的事情(你从来没有提供任何输入字符串),那么是的!
    • 输入字符串就像"asdf_1234_asdf1234asdf.txt" 是的,它现在工作得更好了。谢谢:) @Jean
    猜你喜欢
    • 2021-11-07
    • 1970-01-01
    • 2021-11-16
    • 2012-08-22
    • 2022-07-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-05
    相关资源
    最近更新 更多