我需要对具有3列和n行的2d数组进行排序,我已经设法使用多个循环来做到这一点,但其速度不如id希望的那样快,排序规则如下:
这是我当前的代码:
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数组将太慢。如果可以的话,我可以进一步改善吗?
答案 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]
,但我觉得很难阅读。