【问题标题】:Shouldnt the x[1] just take the second array in the multidimensional array=x[1] 不应该只取多维数组中的第二个数组=
【发布时间】:2020-05-31 20:46:30
【问题描述】:

我无法理解 lambda 函数,我总是把自己弄糊涂,因为我想太多了,这是我的问题:

nm = input().split()
n = int(nm[0])
m = int(nm[1])
arr = []

for _ in range(n):
    arr.append(list(map(int, input().rstrip().split())))

k = int(input())

arr.sort(key=lambda x: x[1]) 

代码的作用现在并不重要,但是如果我打印我的数组(以我的示例为例),我会收到以下输出:

[[7, 1, 0], [10, 2, 5], [6, 5, 9], [9, 9, 9], [1, 23, 12]]

如您所见,它是一个多维数组,现在我想根据每个列表的第二个元素对其进行排序:

arr.sort(key=lambda x: x[1])

所以我有列表,我想用键 lambda 和变量 x 对其进行排序:x[1] 我的变量 x 不应该是多维数组吗?如果我说 x = arr 不一样吗? 这个函数究竟是如何知道我想对每个列表中位于 x[1] 位置的所有元素进行排序的,我原以为使用 x[1] 只会是多维数组中的第二个数组:

[[1, 2, 3], **[4, 2, 6]** ...

我是初学者,所以我希望初学者能友好地回答我的问题, 干杯!

【问题讨论】:

  • “我的变量 x 不应该是多维数组” - 不。这将使key 完全无法使用。
  • 不,x 不是arr,而是arr 中的每个元素,就像使用for 循环时一样。

标签: python function sorting lambda


【解决方案1】:

我将尝试用通俗易懂的语言解释这行代码的作用:

arr.sort(key=lambda x: x[1])

它基本上是说:取 arr 的每个元素,称它为 x,然后使用 x[1] 作为排序键。

所以你的输入是这样的:

[[7, 1, 0], [10, 2, 5], [6, 5, 9], [9, 9, 9], [1, 23, 12]]

它是一个列表的列表,所以如果你使用 sort 函数,结果也是一个列表的列表,按照 lambda 函数中定义的键排序。让我们看看 lambda 在这里做了什么:

  • x 设置为arr 的第一个元素:[7, 1, 0]x[1] 现在是 1
  • x 设置为arr 的第二个元素:[10, 2, 5]x[1] 现在是 2。
  • x 设置为arr 的第三个元素:[6, 5, 9]x[1] 现在是 5。
  • x 设置为arr 的第四个元素:[9, 9, 9]x[1] 现在是 9。
  • x 设置为arr 的第五个元素:[1, 23, 12]x[1] 现在 23 岁。

我们以这种方式提取的密钥现在是[1, 2, 5, 9, 23]。正是这个数字列表决定了排序顺序。由于键已经按顺序排列,因此以这种方式对arr 进行排序不会改变任何内容。

【讨论】:

    【解决方案2】:

    不,lambda 中的 x 不是整个 arr(这有点毫无意义),而是 arr 中的每个 元素,就像使用 @987654326 时一样@循环。

    来自sorted的文档(list.sort也是一样),我的高亮:

    key 指定一个参数的函数,该函数用于从可迭代的每个元素中提取比较键(例如,key=str.lower)。默认值为None(直接比较元素)。

    该函数应用于每个元素以从该元素中提取或计算比较键。在您的情况下,它从arr 中的每个x 中获取第二个元素[1],例如x[6, 5, 9],关键函数提取5,因此排在第三位。

    按照我理解您的问题的方式,这正是您想要做的。相反,如果你想对arr 的第二个子列表进行排序,你可以做arr[1].sort(),或者如果你只想要排序后的第二个元素,例如sorted(x[1] for x in arr).

    【讨论】:

      【解决方案3】:

      请注意,lambda x: x[1] 只是用于创建的方便语法 功能对象。所以不是

      arr.sort(key=lambda x: x[1])
      

      你可以写:

      def key_fun(x):
          return x[1]
      arr.sort(key=key_fun)
      

      我建议您这样做,直到您了解有关 Python 的更多信息。

      arr.sort 带有key 参数也是一种方便的 句法。你可以写而不是arr.sort(key=key_fun)

      arr2 = [(key_fun(x), x) for x in arr]
      arr2.sort()
      arr = [x for (key, x) in arr2]
      

      在后台,arr.sort(key=key_fun) 的工作大致相同 你。

      【讨论】:

        猜你喜欢
        • 2018-04-20
        • 2013-12-14
        • 2018-03-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-05-28
        • 2016-08-26
        • 2012-12-12
        相关资源
        最近更新 更多