【问题标题】:sort method List class排序方法列表类
【发布时间】:2018-04-26 00:41:20
【问题描述】:

我正在尝试解决这个问题,其中,我只需要对数组(python 列表)的奇数进行排序,并让偶数成为。

我解决这个问题的想法:

  1. 将奇数和偶数过滤到单独的列表中。
  2. 对奇数数组进行排序,最后用偶数数组对其进行扩展。

我的代码:

def sort_array(source_array):
    # Return a sorted array.
    odd_arr = list(filter(lambda x: x % 2 != 0, source_array))
    even_arr = list(filter(lambda x: x % 2 == 0, source_array))

    return odd_arr.sort().extend(even_arr)

面临的问题:Python 抛出 AttributeError

追踪:

   Traceback (most recent call last):
  File "main.py", line 3, in <module>
 Test.assert_equals(sort_array([5, 3, 2, 8, 1, 4]), [1, 3, 2, 8, 5, 4])
File "/home/codewarrior/solution.py", line 8, in sort_array
  return odd_arr.sort().extend(even_arr)
AttributeError: 'NoneType' object has no attribute 'extend'

现在每当我 print(odd_arr) 时,我都会得到列表,但当我 print(odd_arr.sort()) 时,我会得到一个 NoneType 对象。我的印象是 sort 和 extend 是列表类方法。我哪里错了?这必须是我自己做的。

编辑: 改代码

def sort_array(source_array):
    odds = [n for n in source_array if n % 2 != 0]
    evens = [n for n in source_array if n % 2 == 0]
    print(odds) # List
    print(evens) # List
    print(sorted(odds).extend(evens)) # None
    return sorted(odds).extend(evens)

【问题讨论】:

  • 您是否愿意使用第三方库(例如numpy)?或者你想这样做吗?
  • 我想保留原版,这将加强我对语言的理解。

标签: python python-3.x


【解决方案1】:

可变类型的方法通常会改变对象并返回None,而不是返回修改后的对象。将此与必须返回已修改对象的不可变类型(例如str)的方法进行对比。

【讨论】:

  • sort() 不就地修改列表吗?我从中了解到的是它会返回一个排序的对象,不是吗?
  • @SaiBorg:“就地”和“返回对象”是 Python 中两个互斥的概念。
【解决方案2】:

你很接近。 list.sort 进行就地排序并返回 None。修改对象的“pythonic”API 通常不返回该对象。大多数程序不会使用该对象,因此它只是引用计数的毫无意义的递增和递减。请改用sorted

return sorted(odd_arr).extend(even_arr)

你也可以用生成器抛弃 filterlambda 的东西

def sort_array(source_array):
    arr = sorted(x for x in source_array if not x % 2).extend(
        x for x in source_array if x % 2)
    return arr

【讨论】:

  • sorted 仍然返回 NoneType!我相信我对语言的理解存在缺陷,这非常令人沮丧。我将在上面编辑我的问题以显示我的位置。
  • 那是我的错。我粘贴了我的修复的早期版本。它从extend 返回None
猜你喜欢
  • 2023-04-04
  • 2021-09-14
  • 2012-06-14
  • 2021-04-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多