【问题标题】:Sort 2D list based on how I sort another 2D list rows with Python根据我使用 Python 对另一个 2D 列表行进行排序的方式对 2D 列表进行排序
【发布时间】:2017-01-24 17:12:26
【问题描述】:

我有一个包含许多元素和不同长度行的二维列表。我们称它为 ListA。 我像这样订购 listA:

listA.sort(key=len)

我有另一个二维列表 (listB),我想像 A 一样排序。如果 A 的第 3 行成为第一行,则 B 的第三行必须先行,以此类推。

我该怎么办?

我不想使用 numpy。

编辑:我尽量说得更清楚:

假设一个矩阵A是这样制作的(原来的矩阵要大很多)

A = [
    [
        [86,98,98,0,0]
    ],

    [
        [79,71,105,1,1],  [79,71,106,1,1],  [80,72,105,0,2]
    ], 

    [
        [86,81,27,1,1],   [85,80,25,1,0]
    ],

    [
        [99,80,73,1,1],  [99,81,73,2,1]
    ]

]

这个矩阵有 4 行不同的长度 (1, 3, 2, 2)。实际上,每个长度都包含我分析的坐标和其他值。 我想订购 A 以便首先我有最短的一排,最后是最长的一排。在这种情况下(1、2、2、3)

现在我还有另一个矩阵 B,它的行数与 A 相同,但与 A 相比长度可能不同。

B = [
    [
        [8,79,3],[8,77,42]
    ],
    [
        [10,83,70]
    ],
    [
        [9,81,74],  [13,67,43],  [4,15,88]
    ],
    [
        [5,14,88]
    ]
]

我想对 B 的行进行排序以对应 A 中的排序行。

【问题讨论】:

  • A 的行数是否与 B 的行数完全相同?如果是这样,那么也许你想要的是一个字典,它从 A 中获取键并为它们分配 B 的值。然后你可以用它做任何你需要的事情。
  • 您是不是发布了一个列表示例以使其更有趣,或者它背后的想法是什么?
  • 所有答案都不适合我。可能我说的不是很清楚。我正在编辑问题以使其更清楚。提出的所有答案都对矩阵进行排序,但不是按照我想要的方式。根据建议的答案,我得到第二个矩阵,第一行包含矩阵的所有元素并排序,而所有其他行都是空的。

标签: python arrays sorting


【解决方案1】:

有了更新的问题,你的问题现在很清楚了。

您可以使用与我之前的答案类似的逻辑。

A=[[[86,98,98,0,0]],[[79,71,105,1,1],[79,71,106,1,1],[80,72,105,0,2]], [[86,81,27,1,1],[85,80,25,1,0]], [[99,80,73,1,1],[99,81,73,2,1]]]

B=[[[8,79,3],[8,77,42]],[[10,83,70]],[[9,81,74],[13,67,43],[4,15,88]],[[5,14,88]]]

#check the length of each row and pair it into a new array
tempA =  [] # array
for index in range(len(A)):
    itemLength = len(A[index])
    tempA.append([itemLength,index, A[index]])

tempB =  {} #dict
for index in range(len(B)):
    tempB[index] = B[index]

# sort tempA according to row length
tempA.sort()
B = []
A = []
for item in tempA:
    indexBeforeSorting  = item[1]
    B.append(tempB[indexBeforeSorting])
    A.append( item[2])

这很好用

【讨论】:

  • 它以某种方式创建一个矩阵,其中第一行包含所有排序的内容,所有其他行为空。但这不是我需要的。您还有其他想法吗?
  • @MichelePaoletti 查看更新后的答案。它非常适合您的问题。让我知道结果。
【解决方案2】:

这就是我要做的事情:

a = ['easd', 'sdvgweag', '21x', 'npasp oopp agt']
b = [42, 7642, 2146, 12]

temp = list(zip(a, range(len(a))))
temp.sort(key=lambda x: len(x[0]))
a.sort(key=len)
print(a)  # ['21x', 'easd', 'sdvgweag', 'npasp oopp agt']
print([b[i] for i in [x[1] for x in temp]])  # [2146, 42, 7642, 12]

这背后的想法是添加一些机制来跟踪列表a中的更改。这就是zip() 所做的。

【讨论】:

  • @leaf 我没有注意到,感谢您指出这一点,但想法和实现是完全相同的。当 OP 发布一些示例时,我会更新..
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-04-01
  • 2018-11-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-22
相关资源
最近更新 更多