没有 lambda 表达式的 python 排序

发布于 2024-09-13 01:34:01 字数 349 浏览 3 评论 0原文

我经常使用 lambda 表达式在 Python 中进行排序,虽然它工作得很好,但我发现它的可读性不太好,并且希望可能有更好的方法。这是我的一个典型用例。

我有一个数字列表,例如,x = [12, 101, 4, 56, ...]

我有一个单独的索引列表:y = range(len(x) )

我想根据 x 中的值对 y 进行排序,我这样做:

y.sort(key=lambda a: x[a])

有没有一种好的方法可以在不使用 lambda 的情况下做到这一点?

I often do sorts in Python using lambda expressions, and although it works fine, I find it not very readable, and was hoping there might be a better way. Here is a typical use case for me.

I have a list of numbers, e.g., x = [12, 101, 4, 56, ...]

I have a separate list of indices: y = range(len(x))

I want to sort y based on the values in x, and I do this:

y.sort(key=lambda a: x[a])

Is there a good way to do this without using lambda?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

柏拉图鍀咏恒 2024-09-20 01:34:01

您可以使用列表 x 的 __getitem__ 方法。这与 lambda 的行为相同,并且速度更快,因为它是作为 C 函数而不是 python 函数实现的:

>>> x = [12, 101, 4, 56]
>>> y = range(len(x))
>>> sorted(y, key=x.__getitem__)
[2, 0, 3, 1]

You can use the __getitem__ method of the list x. This behaves the same as your lambda and will be much faster since it is implemented as a C function instead of a python function:

>>> x = [12, 101, 4, 56]
>>> y = range(len(x))
>>> sorted(y, key=x.__getitem__)
[2, 0, 3, 1]
狠疯拽 2024-09-20 01:34:01

不优雅,但是:

[a for (v, a) in sorted((x[a], a) for a in y)]

顺便说一句,您可以在不创建单独的索引列表的情况下执行此操作:

[i for (v, i) in sorted((v, i) for (i, v) in enumerate(x))]

Not elegantly, but:

[a for (v, a) in sorted((x[a], a) for a in y)]

BTW, you can do this without creating a separate list of indices:

[i for (v, i) in sorted((v, i) for (i, v) in enumerate(x))]
秋千易 2024-09-20 01:34:01

我不确定这是否是您想要的替代方案,但您可以使用 def 定义关键函数:

def sort_key(value):
    return x[value]

y.sort(key = sort_key)

就个人而言,我认为这比 lambda 更糟糕因为它将排序标准从执行排序的代码行移开,并且不必要地将 sort_key 函数添加到您的命名空间中。

I'm not sure if this is the kind of alternative you meant, but you could define the key function with a def:

def sort_key(value):
    return x[value]

y.sort(key = sort_key)

Personally, I think this is worse than the lambda as it moves the sort criteria away from the line of code doing the sort and it needlessly adds the sort_key function into your namespace.

胡大本事 2024-09-20 01:34:01

我想如果我想创建另一个函数,我可以这样做(未测试):

def sortUsingList(indices, values):
    return indices[:].sort(key=lambda a: values[a])

虽然我认为我更喜欢使用 lambda 来避免创建额外的函数。

I suppose if I wanted to create another function, I could do it something like this (not tested):

def sortUsingList(indices, values):
    return indices[:].sort(key=lambda a: values[a])

Though I think I prefer to use lambda instead to avoid having to create an extra function.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文