python - 根据键重新排列列表而不排序

标签 python algorithm list data-structures

我有一个元组列表 (x, ind) 其中 x 是项目而 ind 是它在结果列表中的目标索引.该列表是随机排列的,但可以假设如果列表中有 N 项,则元组中 ind 的值将在 [ 0,N) 没有重复(即所有有效索引将只存在一次)。如何获取每个元组位置为 ind 的列表?

请不要与许多关于如何按键排序的现有答案混淆。

显然,按 ind 键排序很容易,但是会有不必要的额外 O(n*logn) 成本,而 O 应该是(n) 操作,因为上述关于 ind 值的假设。

所以:

l = [('item1',1), ('item0',0), ('item2',2), ('item4',4), ('item3',3)]
l2 = magic_rearrange(l, key=lambda x: x[1])
print(l2)

应该给:

[('item0',0), ('item1',1), ('item2',2), ('item3',3), ('item4',4)]

最佳答案

假设您的索引是唯一的,这是一种方法。您可以初始化一个新列表,然后将元素插入到正确的位置。

def magic_rearrange(l1):
    l2 = [None] * len(l1)
    for i in l1:
        l2[i[1]] = i
    return l2

还有一个演示:

>>> l = [('item1',1), ('item0',0), ('item2',2), ('item4',4), ('item3',3)]
>>> magic_rearrange(l)
[('item0', 0), ('item1', 1), ('item2', 2), ('item3', 3), ('item4', 4)]

如果您使用 numpy 的精美索引,有一种更快的方法可以做到这一点。

import numpy as np
def magic_rearrange(l1):
    l2 = np.repeat(None, len(l1))
    l2[[x[1] for x in l1]] = l1
    return l2

还有一个演示:

>>> magic_rearrange(l)
array([('item0', 0), ('item1', 1), ('item2', 2), ('item3', 3), ('item4', 4)], dtype=object)

关于python - 根据键重新排列列表而不排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44652962/

相关文章:

algorithm - 生成现实的股票价格

java - 从java中的列表中获取列表?

c# - 将列表从代码隐藏转移到 aspx 页面

python - 遍历python对象的路径语法

python 3错误RuntimeError : super(): no arguments

python - 使用 SQLALCHEMY 设置 Oracle VARCHAR2 长度 i 字节

python - attributeError ("' _AssertRaisesContext' 对象没有属性 'exception' ",),

algorithm - MATLAB 函数可以将数学函数作为输入吗?

字符串预处理步骤,在 O(1) 时间内回答进一步的查询

list - 在 Prolog 中查找所有列表旋转