【问题标题】:I'm Unsure How to Write a Function for Sorting (Using the Key Parameter) and Rewrite the Function Using a Lambda Expression我不确定如何编写排序函数(使用键参数)和使用 Lambda 表达式重写函数
【发布时间】:2019-04-30 15:11:13
【问题描述】:

创建一个名为 last_four 的函数,该函数接受一个 ID 号并返回最后四位数字。例如,数字 17573005 应该返回 3005。然后,使用此函数将存储在变量 ids 中的 id 列表从低到高排序。将此排序列表保存在变量 sorted_ids 中。提示:请记住,只能索引字符串,因此可能需要进行转换。

问题的第二部分是,“按每个 id 的最后四位对列表 id 进行排序。使用 lambda 而不是使用定义的函数来执行此操作。将此排序后的列表保存在变量 sorted_id 中”

我已经定义了我的函数定义,以及它接受的输入。我已经创建了一个空列表,然后我创建了一个循环遍历我的输入值,我将最后四位数字附加到我创建的空列表。我对输入中的所有项目都这样做。我使用 sorted 函数将我创建的列表设置为等于其自身的排序版本,并且我有返回排序列表的函数。

然后我将变量 sorted_ids 设置为等于 last_four 并指定输入参数。

def last_four(x):
    r = []
    for i in x:
        r.append(str(i)[-4:])

    r = sorted(r)
    print(r)
    return r

ids = [17573005, 17572342, 17579000, 17570002, 17572345, 17579329]

sorted_ids = last_four(ids)

当我运行上面的代码时,我收到一条错误消息,“错误:TypeError:'int' object is not iterable”,因为输入是一个 id 列表。通过阅读如何解决这个问题,我认为我的结果应该类似于“sorted_ids = sorted(ids, key = last_four)”。当我尝试使用上一句中的代码 sn-p 时,仍然得到与之前提到的相同的 TypeError。我不确定如何使用可选的 key 参数来编写它。

我还需要在没有定义函数 last_four 的情况下使用 Lambda 表达式编写函数并获得相同的结果,但我不知道该怎么做。

任何指导将不胜感激。

【问题讨论】:

  • 我复制并粘贴了您的代码,它在 Python 3.7.3 中无需修改即可工作,输出为:['0002', '2342', '2345', '3005', '9000', '9329']。你目前使用的是什么版本的 Python?
  • @willk,我刚刚在 repl.it 中尝试过,它在那个环境中工作。我进行练习的环境是 Runestone 3.3.2 - interactivepython.org/runestone/static/overview/overview.html。我不清楚它是哪个版本的 Python。我认为要传递作业,我需要使用可选的 key 参数 - “sorted_ids = sorted(ids, key = last_four)”,我还没有弄清楚如何用 Runestone 编写。我还需要使用 Lambda 表达式重写,我不知道该怎么做。你有什么想法吗?
  • 是的,我了解您的需求并已发布我的回复。

标签: python-3.x function sorting lambda optional-parameters


【解决方案1】:

要使用sortedlambda 函数作为key 执行此操作,您需要在lambda 函数中指定要对列表的每个元素执行的操作。在这种情况下,您希望将每个 id 的最后四个数字作为子集,这只能通过将整数 id 转换为字符串来完成。

这意味着带有lambda 函数的sorted 表达式对于key 是:

ids = [17573005, 17572342, 17579000, 17570002, 17572345, 17579329]
sorted(ids, key=lambda x: str(x)[-4:])

# Output
[17570002, 17572342, 17572345, 17573005, 17579000, 17579329]

这表示在将 id 转换为字符串后,按每个 id 的最后四位数字对列表进行排序。

使用命名函数的等效方法是:

def last_four(x):
    return str(x)[-4:]

sorted(ids, key=last_four)

选择权在你。 lambda 表达式代码较少,但命名函数 (last_four) 可能更容易理解。

【讨论】:

  • 您使用 sorted 和 key = lambda 编写它的方式对我来说很有意义!当我尝试使用 key = last_four 时,我遇到了问题。我觉得我犯了一个愚蠢的错误。以下是我正在尝试做的事情:def last_four(x): return x[-4:] ids = [17573005, 17572342, 17579000, 17570002, 17572345, 17579329] sorted_ids = sorted(ids, key = last_four)
  • 如果您打算这样做,您需要将x 转换为last_four 中的str
  • 我已经更新了我的答案,以展示如何使用 sorted 中的 key 的命名函数来解决问题。
  • 做到了!我的愚蠢错误,感谢清晰的代码和耐心!
  • 刚刚勾选了您的答案,再次感谢您的帮助!
【解决方案2】:

最好的方法是对数字取模。 eg: 17573005%10000=3005 就是需要的结果。

def last_four(x):
    return x%10000

然后调用这个函数作为sorted()函数的key

ids = [17573005, 17572342, 17579000, 17570002, 17572345, 17579329]
sorted_ids = sorted(ids,key=last_four)

现在使用 lambda 它看起来像:

sorted_id = sorted(ids,key = lambda k: k%10000)

【讨论】:

    【解决方案3】:

    这是错误的

    def last_four(x): r = [] 对于 x 中的 i: r.append(str(i)[-4:])

    r = sorted(r)
    print(r)
    return r
    

    id = [17573005, 17572342, 17579000, 17570002, 17572345, 17579329]

    sorted_ids = last_four(ids)

    【讨论】:

    • 点评来源: 您好,请不要只用源代码回答。尝试对您的解决方案如何工作提供一个很好的描述。请参阅:How do I write a good answer?。谢谢
    【解决方案4】:

    你可以试试这个:

    def last_four(x):
        x = x-17570000
        return x
    a
    ids = [17573005, 17572342, 17579000, 17570002, 17572345, 17579329]    
    sorted_ids = sorted(ids, key=lambda x:last_four(x))
    print(sorted_ids)
    

    【讨论】:

    • 欢迎来到 SO,Ishant Nand。请尝试正确格式化您的代码,以便其他人可以轻松阅读。
    猜你喜欢
    • 1970-01-01
    • 2019-12-24
    • 2018-02-15
    • 2020-01-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-13
    • 1970-01-01
    相关资源
    最近更新 更多