【问题标题】:Using sort() vs. sorted() when sorting a slice of an array- why does sort() not work?在对数组的切片进行排序时使用 sort() 与 sorted() - 为什么 sort() 不起作用?
【发布时间】:2022-01-21 13:28:05
【问题描述】:

我有一个输入array = [1,3,8,5,22,18,20,15,7,6,5]

我想对列表中从 8 到 20 的数字进行排序,包括 8 和 20。

为什么以下方法不起作用:

array[2:7] = array[2:7].sort()     #TypeError: can only assign an iterable

同时

array[2:7] = sorted(array[2:7]) 

有效。

我从概念上理解sort() 对输入进行就地排序,而sorted() 创建一个新列表。但我无法理解这与上述内容有何关联。

是不是因为sort() 更改了索引,从而导致第一个实例不起作用?但这不可能,因为错误是 TypeError 必须是可迭代的?

【问题讨论】:

  • 因为.sort返回None,sorted返回新列表。
  • 明白了,谢谢

标签: python arrays sorting


【解决方案1】:

不同之处在于sorted 可以应用于任何可迭代对象,无论是列表还是不可变元组、集合甚至生成器,都会生成一个列表。另一方面,sort 是一些可变有序容器提供的方法,会就地改变它的容器。

发生的情况是切片返回一个副本,该副本将被sort 方法正确排序,但sort 方法的返回值是...None!所以你的代码结束于:

array[2:7] = None

...而None 不是可迭代的...

【讨论】:

  • @jonrsharpe 我的错……我应该测试一下。不幸的是,我无法删除此答案,因为它已被接受,因此我对其进行了编辑...感谢您的提醒!
【解决方案2】:

sort() 不起作用,因为它不返回数组,它只会更改现有数组。

这可行:

arr_slice = array[2:7]
arr_slice.sort() # Sorts arr_slice but returns None
array[2:7] = arr_slice

【讨论】:

    猜你喜欢
    • 2021-10-28
    • 2019-11-03
    • 2021-07-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多