根据我如何使用Python对另一个2D列表行进行排序来对2D列表进行排序

时间:2017-01-24 17:12:27

标签: python arrays sorting

我有一个2D列表,其中包含许多元素和不同长度的行。我们称之为ListA。 我订购listA像这样:

listA.sort(key=len)

我有另一个2D列表(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中的排序行。

2 个答案:

答案 0 :(得分:0)

这就是我要做的事情:

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()的作用。

答案 1 :(得分:0)

通过更新的问题,您现在的问题非常明确。

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

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])

这完美无缺