【问题标题】:How to reorder a list based on the known order? [duplicate]如何根据已知顺序重新排序列表? [复制]
【发布时间】:2018-06-01 08:40:32
【问题描述】:

在python3中,如果我有一个列表[a,b,c,d,e],它的排名顺序[1,4,2,2,0]与元素cd共享相同的顺序。如何获取新列表[e,a,c,d,b]

【问题讨论】:

  • 注意,sorted(zip(ranklist, mylist)) 给你类似[(0, 'e'), (1, 'a'), (2, 'c'), (2, 'd'), (4, 'b')]
  • 或者,你可以先map = dict(zip(mylist, ranklist)) 然后sorted(mylist, key=map.get)
  • 链接到已接受答案的链接涉及一种排序算法,我认为它是一个 n log(n) 操作。可以在 O(n) 时间内进行就地重新排序。链接到reorder according to rank 的示例(请注意此示例的标题未提及排名,但它是按排名重新排序。)
  • 我想知道根据排名重新排序有多常见。如果生成一个索引 0 到 n-1 的数组,然后根据数组对索引进行排序,你会得到类似 [4,0,2,3,1] 的内容(顺序为 list[4], list[0], list[2], list[3], list[1]) 而不是排名 [1,4,2,3,0]。您可以从根据数组排序的索引生成排名:rank[index[i]] = i,反之亦然:index[rank[i]] = i.

标签: python python-3.x sorting ranking rank


【解决方案1】:

如果您正在寻找与“冒泡排序”相似的详细算法:

original = [a,b,c,d,e]
order = [1,4,2,2,0]

# Initialize list
new = [None for x in range(len(original))]

for i, item in enumerate(original):
    idx = order[i]
    if new[idx] is None:
        new[idx] = item
    else:
        while True:
            if new[idx] < item:
                idx += 1
                if new[idx] is None:
                    new[idx] = item
                    break
            else:
                temp = new[idx]
                new[idx] = item
                while True:
                    idx += 1
                    if new[idx] is None:
                        new[idx] = temp
                        break
                    else:
                        temp2 = new[idx]
                        new[idx] = temp
                        temp = temp2

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-02-27
    • 1970-01-01
    • 2011-12-19
    • 2013-05-10
    • 2019-07-09
    • 2019-03-20
    • 2018-01-03
    • 1970-01-01
    相关资源
    最近更新 更多