编写 Python 程序根据其他列表对列表进行排序

2024 年 8 月 29 日 | 5 分钟阅读

在本教程中,我们将编写 Python 程序,根据给定的另一个数组对数组进行排序。在此问题中,我们有两个大小为 N 和 M 的数组,我们需要对第一个数组进行排序,以便第一个数组中元素的所有相对位置与第二个数组中元素的位置相同。让我们看下面的例子-

示例 - 1

输入

输出

[5, 5, 3, 3, 1, 1, 1, 2, 9]

说明

a1 的第一个数组元素根据 a2 中元素的位置进行排序。所以 5 先出现,然后是 3,然后是 1,最后是 2。现在,我们按升序附加剩余的元素。

示例 - 2

输入

输出

[1, 1, 2, 2, 3, 3]

解释 -

由于 a1 中没有 a2 中存在的元素,因此我们无法根据 a2 对 a1 进行排序。因此,我们将 a1 中的元素按非递减顺序排序。

让我们进入解决方案部分。

解决方案 - 暴力法

让我们理解下面的代码片段-

示例 -

输出

[5, 5, 3, 3, 1, 1, 1, 2, 9]

解释 -

在上面的代码中,我们定义了一个名为 sorted_array() 的函数,该函数接受两个数组 a1 和 a2 作为输入。该函数旨在根据 a2 指定的顺序对 a1 中的元素进行排序。

  1. 在函数中,我们初始化一个名为 `count` 的空字典和一个名为 sorted_array 的空列表。
  2. 然后,它使用循环计算 `a1` 中每个数字的出现次数。对于 `a1` 中的每个数字 `num`,它会检查 `num` 是否已是 `count` 中的键。如果是,则该数字的计数加 1。否则,将一个新键 `num` 添加到 `count` 中,初始计数为 1。
  3. 接下来,代码迭代 a2 中的元素。对于 a2 中的每个数字 num,它会检查 num 是否存在于 count 中。如果存在,代码会通过将 num 重复相应次数(如 count[num] 中存储的)来扩展 sorted_array。然后使用 `del` 关键字从 `count` 中删除键 `num`。
  4. 处理完 a2 中的所有元素后,代码会检查 sorted_array 是否为空。如果是,则表示 a2 中的元素都没有在 a1 中找到。在这种情况下,代码使用 sorted() 函数将 a1 的排序版本赋值给 sorted_array。此步骤确保 sorted_array 包含 a1 的已排序元素,按非递减顺序排列。
  5. 最后,代码将 `count` 字典中的剩余元素添加到 `sorted_array`。它迭代 `count` 的已排序键,并通过将每个键 `num` 重复相应次数(如 count[num] 中存储的)来扩展 `sorted_array`。
  6. 然后,已排序数组 `sorted_array` 作为函数的返回值。
  7. 在代码的主体部分,它创建了两个具有特定值的数组 `a1` 和 `a2`。然后,它使用这些数组作为参数调用 `sorted_array` 函数,并打印结果排序数组。

方法 - 2

让我们来看另一个例子。

示例 -

输出

[1, 1, 1, 2, 3, 3, 5, 5, 9]

解释 -

在上面的代码中,我们定义了 sort_array() 函数,它接受两个参数:arr(要排序的数组)和 order(用于排序的参考数组)。

在 sort_array 函数中,我们创建一个名为 order_dict 的字典来存储 order 数组中元素的索引。此字典将帮助我们确定 arr 中每个元素的排序顺序。

我们定义了一个名为 custom_key 的自定义排序键函数,该函数将 arr 中的元素作为参数。sorted 函数将使用此函数来确定排序顺序。

在 custom_key 函数内部,我们首先检查元素是否存在于 order_dict 字典中。如果存在,则返回 order 数组中的相应索引。这确保了 arr 中与 order 中的顺序匹配的元素将按相应顺序排序。

如果元素在 order_dict 字典中未找到,则表示与 order 数组不匹配。在这种情况下,我们将一个更高的索引分配给该元素,方法是为其加上 len(order)。这确保了 arr 中未匹配的元素将按非递减顺序排在匹配元素之后。

最后,我们使用 sorted 函数,以 custom_key 函数作为排序键,对 arr 数组进行排序。排序后的数组存储在 sorted_arr 变量中。

然后从 sort_array 函数返回 sorted_arr。

最后,我们打印 sorted_a1 数组,其中包含根据 a2 的顺序排序的 a1,未匹配的元素按非递减顺序排序。