有没有一种方法可以改善python中的2d数组排序?

时间:2020-10-24 06:25:00

标签: python arrays sorting multidimensional-array

我需要对具有3列和n行的2d数组进行排序,我已经设法使用多个循环来做到这一点,但其速度不如id希望的那样快,排序规则如下:

  1. 第一个元素在字母后面排序。
  2. 如果第2行的第一个元素彼此相同,则第2和第3个元素之和较小的行排在第一位。
  3. 如果第二行的第二和第三元素的总和相同且第一个元素相同,则第二个元素较小的元素排在第一位。 据此,第一个元素是字符串类型,第二个和第三个元素是整数

这是我当前的代码:

n = int(input())
my = []
for i in range(0, n):
    my.append(input().split())
my = sorted(my, key=lambda item: item[0])
for o in range(0, n):
    for i in range(0, n-1):
        if my[i][0] == my[i+1][0]:
            if int(my[i][1]) + int(my[i][2]) > int(my[i+1][1]) + int(my[i+1][2]):
                cur1, cur2 = my[i], my[i+1]
                my[i] = cur2
                my[i+1] = cur1
            if int(my[i][1]) + int(my[i][2]) == int(my[i+1][1]) + int(my[i+1][2]):
                if int(my[i][1]) > int(my[i+1][1]):
                    cur1, cur2 = my[i], my[i + 1]
                    my[i] = cur2
                    my[i + 1] = cur1
k = sum(my, [])
z = ""
for i in range(0, len(k)):
    z += k[i] + " "
    if (i + 1) % 3 == 0:
        z += "\n"
print(z)

一些例子:

example input 1:
5
a 9 2
b 2 3
a 5 3
c 8 0
c 10 5
example output 1:
a 5 3
a 9 2
b 2 3
c 8 0
c 10 5
example input 2:
10
b 7 0
b 1 6
d 0 8
a 7 9
c 10 5
d 1 2
c 5 10
c 2 5
d 4 8
d 7 0
example output 2:
a 7 9
b 1 6
b 7 0
c 2 5
c 5 10
c 10 5
d 1 2
d 7 0
d 0 8
d 4 8

但是我面临的问题是,具有2000个或更多元素的2d数组将太慢。如果可以的话,我可以进一步改善吗?

1 个答案:

答案 0 :(得分:0)

您应该编写一个比较两行的函数。这是sorted的非常简单的键函数。

def custom_sort(row):
    return (row[0], sum(row[1:3]), row[1] * -1)

my = sorted(my, key=custom_sort)

由于元组会自动按照相同的“分层”顺序进行排序,因此这应该为您提供正确的行为。

  • row[0]按字典顺序进行比较。如果不确定row[0]是否始终是字符串,则可以先强制转换(str(row[0])
  • sum(row[1:3])后两个元素的总和
  • row[1] * -1使第二个元素取反,从而有效地反转了排序。也可以将其拼写为-row[1],但我觉得很难阅读。