【问题标题】:Sorting a list by function leads to wrong result [closed]按功能对列表进行排序会导致错误的结果[关闭]
【发布时间】:2016-11-08 23:43:32
【问题描述】:

在函数中将列表作为参数传递时,为什么下面的列表没有改变?

def foo(*x):
    y=sorted(x)
    print(y)

a=[3,2,1]

函数返回[[3, 2, 1]],而不是[[1,2,3]]。为什么会这样?这与按值调用有关吗?

【问题讨论】:

  • 您是如何准确调用该函数的?您是否期望通过简单地调用foo 来改变a?此外,还有一个问题,您认为函数定义中的星号对于 Python 意味着什么?
  • 1.这个标题没用。 2.格式坏了,例子没有意义。 3. 因为sorted如记录返回一个新列表,它不会对旧列表进行排序(使用list.sort,它返回None,就地排序)。跨度>
  • def foo(*x): 你认为星号对x 做了什么?
  • 你的函数没有返回[[3, 2, 1]]。它正在打印 [[3, 2, 1]] 并返回None。您正在对单个元素元组进行排序,该元组恰好包含一个 3 元素列表;该内部列表不受影响。
  • 您真正希望foo 返回什么?你想要[1, 2, 3] 还是[[1, 2, 3]]

标签: python sorting


【解决方案1】:

为什么要创建另一个函数? 你可以这样做

>>> a = [3,2,1]
>>> sorted(a)
[1, 2, 3]

但是,如果您想创建另一个函数。你必须调用它。

def foo(x):
    y=sorted(x)
    return y
a = [3,2,1]
print(foo(a))

【讨论】:

  • 谢谢。我现在明白了:)
【解决方案2】:

正如蓝色星期一所说,无需为此创建新函数,您只需调用 sorted 函数即可。不过,这里有几种其他方法可以修复您的代码。

a = [3, 2, 1]

def foo1(*x):
    y = sorted(*x)
    print(x, y)
    return y

print(foo1(a))

def foo2(*x):
    y = sorted(x)
    print(x, y)
    return y

print(foo2(*a))
print(foo2(5, 4, 7, 6))

输出

([3, 2, 1],) [1, 2, 3]
[1, 2, 3]
(3, 2, 1) [1, 2, 3]
[1, 2, 3]
(5, 4, 7, 6) [4, 5, 6, 7]
[4, 5, 6, 7]

请注意,foo2 期望我们将要排序的项目作为单独的参数传递。我们可以通过在函数调用中使用*“splat”操作符来传递一个列表(或元组)。请参阅 Python 官方教程中的Unpacking Argument Lists

【讨论】:

    【解决方案3】:

    因为你的函数的参数被指定为*a,这就像说你的参数是一个未定义维度的元组

    当您尝试使用嵌套列表对元组进行排序时,值不会改变

    事实上你得到了一个列表列表(你得到的是 [[3, 2, 1]] 而不是 [3, 2, 1])

    如果你试试这个,它会起作用的

    def foo(*x): 
        y=sorted(x[0]) 
        print(y)
    

    【讨论】:

    • 你也可以注意到sorted()无论传入什么类型的数据结构都会返回一个列表。
    • 谢谢。我现在明白了:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-08-28
    • 1970-01-01
    • 2019-08-01
    • 2021-08-14
    • 1970-01-01
    • 2013-09-08
    • 1970-01-01
    相关资源
    最近更新 更多