gpt4 book ai didi

python - 如何按值(来自矩阵)对列表进行排序,并按第一个最小值、然后按第二个最小值等打破联系?

转载 作者:行者123 更新时间:2023-11-30 22:43:00 24 4
gpt4 key购买 nike

假设我有一个矩阵,其中每一列都与一个值关联。例如:

A = [[ 7.41,  5.44,  4.75,  0.35,  6.50],
[ 9.59, 5.68, 8.72, 7.88, 5.04],
[ 3.61, 2.79, 3.36, 4.05, 5.81],
[ 3.35, 4.52, 0.35, 5.47, 3.35],
[ 8.69, 3.79, 9.86, 1.90, 7.80]]

第 0 列、第 1 列、第 2 列、第 3 列和第 4 列的值为 C = [3, 3, 3, 2, 3] ,分别。

现在,我想对 A 的列进行排序按它们的值,即具有最高值的列是第一个,依此类推。我将得到:

S = sort C in decreasing order
S = [4, 2, 1, 0, 3]

但是C中有很多联系所以我需要首先打破这些联系。如果总是存在平局,则按第二个最小值打破它们,依此类推。否则,任意打破平局。

在我的示例中,我应该打破列 4, 2, 1 之间的联系和0因为它们在 C 中具有相同的值。 (注意。列 3 排在最后,因为它具有最低值并且是唯一的。)所以让我们看看列 [0, 1, 2, 4] 中的第 i 个最小值。 .

列中的第一个最小值 [0, 1, 2, 4]M1 = [3.35, 2.79, 0.35, 3.35]第二个最小值是 M2 = [3.61, 3.79, 3.36, 5.04] 。 (在这个例子中,我们只需要查找第二个最小值。)我们有:

  • 专栏2最小值为 M1 ,它是第一位的。
  • 列后 2 ,来专栏1因为它有第二个第一个最小值。
  • 现在,专栏 0和列4具有相同的第一个最小值。我们必须看到它们的第二个最小值 M2 。因为3.61<5.04 ,栏0出现在列 4 之前。

因此最终排序的列是

Final = [2, 1, 0, 4, 3]

如何在 Python 中实现这种排序?

最佳答案

按降序值和排序列对列进行排序。这样,将首先比较列的最小值,然后比较第二小的值,依此类推:

# transpose to list of columns
a_trans = list(zip(*A)) # Py3
a_trans = zip(*A) # Py2

# zip columns with indeces and values
cols_c = list(zip(range(len(C)), C, a_trans)) # Py3
cols_c = zip(range(len(C)), C, a_trans) # Py2

# sort by desc value and sorted column
cols_c.sort(key=lambda x: (-x[1], sorted(x[2])))

现在您可以构造排序后的原始矩阵:

# extract columns and transpose back to rows
A_sort = list(map(list, zip(*(c for i, val, c in cols_c)))) # Py3
A_sort = map(list, zip(*(c for i, val, c in cols_c))) # Py2
[[4.75, 5.44, 7.41, 6.5, 0.35],
[8.72, 5.68, 9.59, 5.04, 7.88],
[3.36, 2.79, 3.61, 5.81, 4.05],
[0.35, 4.52, 3.35, 3.35, 5.47],
[9.86, 3.79, 8.69, 7.8, 1.9]]

或者只是有序的索引:

indeces = [i for i, val, c in cols_c]
[2, 1, 0, 4, 3]

如果您不介意在元组或某物上使用迭代器。同样,您可以省略一些转换调用。

一些引用:

关于python - 如何按值(来自矩阵)对列表进行排序,并按第一个最小值、然后按第二个最小值等打破联系?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41924533/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com