gpt4 book ai didi

Python 将矩阵行排序为行梯形......排序

转载 作者:太空宇宙 更新时间:2023-11-03 14:29:43 24 4
gpt4 key购买 nike

我正在尝试弄清楚如何在 Python 3.5 中为二维数组编写自定义排序函数。这个想法是将数组转换为半行梯形形式,其中任何以 1 开头的行都移动到其他行的顶部,任何以 0 开头的行都移动到底部,其余行在两者之间排序。您可以看到下面的示例矩阵。

before = [
[5, 3, 1, 2, 3, 1],
[0, 1, -1, 2, -3, 4],
[0, 0, 2, 2, -1, 3],
[1, 2, 5, -2, 4, -3],
[2, 1, 1, -1, 4, 2],
[0, 0, 1, 4, 5, -1]
]

after = [
[1, 2, 5, -2, 4, -3],
[2, 1, 1, -1, 4, 2],
[5, 3, 1, 2, 3, 1],
[0, 1, -1, 2, -3, 4],
[0, 0, 1, 4, 5, -1],
[0, 0, 2, 2, -1, 3]
]

如果我在 Java 中执行此操作,我会编写一个 Comparator 对象或一个compareTo 方法。但在网上查看,在 Python 3+ 中,排序时似乎不再使用 cmp 参数的 Pythonic 方式。

现在我可以使用

for i in range(len(mat)-1, -1, -1):
mat.sort(key=itemgetter(i), reverse=True)

执行此操作,但这不会将第一个非零值为 1 的行移动到顶部。

我很感激任何人可能必须以最Pythonic的方式做到这一点的建议。另外,如果有人有任何好的资源来学习正确的Python方式做其他事情,我将不胜感激。有时我做的事情就好像我用其他语言编写它们一样,并且没有意识到 Python 有一种首选的执行方式(我正在看着你,列表推导式)。

最佳答案

你可以尝试这样的事情:

mat.sort(key=lambda l: [
(0, 0) if x == 1 else
(2, 0) if x == 0 else
(1, x) for x in l
])

并利用元组和列表按字典顺序比较的事实,比较前两个元素等等。

<小时/>

编辑:

我改变了我的观点,我认为与创建比较函数(不是那么清晰)相比,按照上面的方式进行操作可能是更好的方法,而且也更快。

测试代码:

TRIALS = 10000

mat = [
[5, 3, 1, 2, 3, 1],
[0, 1, -1, 2, -3, 4],
[0, 0, 2, 2, -1, 3],
[1, 2, 5, -2, 4, -3],
[2, 1, 1, -1, 4, 2],
[0, 0, 1, 4, 5, -1]
]

@functools.cmp_to_key
def matcmp(a, b):
for ai, bi in zip(a, b):
if (ai == bi): continue

if (0 != ai != 1 and 0 != bi != 1):
return a < b
elif (ai == 1 or bi == 0):
return -1
else:
return 1
else:
return 0

start = time.time()

for i in range(TRIALS):
sorted(mat, key=matcmp)

print(time.time() - start)

start = time.time()

for i in range(TRIALS):
sorted(mat, key=lambda l: [
(0, 0) if x == 1 else
(2, 0) if x == 0 else
(1, x) for x in l
])

print(time.time() - start)

输出:

0.10232377052307129
0.09116077423095703

关于Python 将矩阵行排序为行梯形......排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47386541/

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