【问题标题】:Python, sort a list by another list [duplicate]Python,按另一个列表对列表进行排序[重复]
【发布时间】:2014-05-28 22:36:28
【问题描述】:

我有一个列表a:

a = ['c','d','b','a','e']

还有一个列表b:

b = ['a001','b002','c003','d004','e005']

我怎样才能得到我的列表c 如下:

c = ['c003','d004','b002','a001','e005']

基本上按照a 中定义的顺序,使用每个元素的一部分对b 进行排序。

非常感谢。

【问题讨论】:

    标签: python python-2.7


    【解决方案1】:

    如果您有一个非常大的列表,使用.index 的解决方案将不会非常有效,因为第一个列表将是index'd 对于第二个列表中的每个条目。这将花费 O(n^2) 时间。

    相反,您可以构造一个排序映射:

    order = {v:i for i,v in enumerate(a)}
    c = sorted(b, key=lambda x: order[x[0]])
    

    【讨论】:

    • 问题:在排序过程中key 被调用了多少次? n?是否存在由关键结果组成的缓存?
    • @njzk2: IIRC key 为每个元素计算一次并存储。这与 cmp 参数形成对比,每次比较都会评估一次。
    【解决方案2】:

    您可以使用 sorted() 的 key 命名参数来做到这一点:

    c = sorted(b, key = lambda e: a.index(e[0]))
    

    【讨论】:

    • 这是个坏主意。 index 将对 a 执行 O(N) 搜索,从而得到 O(N² log N) 排序。
    • 排序通常称为O(N log N),其中N 是列表中元素的数量。这不一定与a 中的元素数相同。如果a 很小,那么这可能比设置dict 更快。像往常一样,使用您的用例中的数据测试性能。
    【解决方案3】:

    您可以尝试将lambda 函数传递给sorted() 内置函数的key 参数:

    a = ['c', 'd', 'B', 'a', 'e']
    b = ['a001', 'B002', 'c003', 'd004', 'e005']
    c = sorted(b, key = lambda x: a.index(x[0])) # ['c003', 'd004', 'b002', 'a001', 'e005']
    

    【讨论】:

    • 这是个坏主意。 index 将对 a 执行 O(N) 搜索,从而得到 O(N² log N) 排序。
    猜你喜欢
    • 2019-01-17
    • 2013-09-12
    • 1970-01-01
    • 2019-07-30
    • 2015-11-14
    • 2022-01-04
    • 2013-09-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多