为了账号安全,请及时绑定邮箱和手机立即绑定

如何根据另一个列表对列表进行排序?

如何根据另一个列表对列表进行排序?

30秒到达战场 2019-10-30 10:49:48
有一个清单:a = [("ax", 1), ("ec", 3), ("bk", 5)]另一个清单:b = ["ec", "ax", "bk"]我要排序a根据b:sort_it(a, b)a = [("ec", 3), ("ax", 1), ("bk", 5)]这个怎么做?
查看完整描述

3 回答

?
开满天机

TA贡献1786条经验 获得超13个赞

a.sort(key=lambda x: b.index(x[0]))

这a使用b每个元组的第一个元素的index in a作为对其进行排序的值就地进行排序。


另一种可能更简洁的书写方式是:


a.sort(key=lambda (x,y): b.index(x))

如果您有大量项目,则做一些不同的事情可能会更有效率,因为.index()在长列表上可能是一项昂贵的操作,并且由于您已经知道顺序,因此实际上不需要进行完全排序:


mapping = dict(a)

a[:] = [(x,mapping[x]) for x in b]

请注意,这仅适用于2元组的列表。如果您希望它适用于任意长度的元组,则需要对其进行一些修改:


mapping = dict((x[0], x[1:]) for x in a)

a[:] = [(x,) + mapping[x] for x in b]


查看完整回答
反对 回复 2019-10-30
?
宝慕林4294392

TA贡献2021条经验 获得超8个赞

实际上,有一种方法可以在线性O(n)时间中执行此操作,因为这实际上不是排序操作。列表的存在b意味着排序已经完成;我们真正需要做的就是重新排列元素的a顺序。多亏了词典,这可以有效地完成。


from collections import defaultdict


def sorted_by(seq_to_sort, desired_order, key=None):

    if key is None:

        key = lambda x: x


    # group the elements by their key

    grouped_items = defaultdict(list)

    for item in seq_to_sort:

        k = key(item)

        grouped_items[k].append(item)


    # flatten the dict of groups to a list

    return [item for key in desired_order for item in grouped_items[key]]

用法:


a = [("ax", 1), ("ec", 3), ("bk", 5)]

b = ["ec", "ax", "bk"]

result = sorted_by(a, b, lambda tup: tup[0])

print(result)  # output: [("ec", 3), ("ax", 1), ("bk", 5)]

笔记:


这是一个稳定的排序;如果两个列表项具有相同的键,则将保留其顺序。例:


>>> sorted_by([1, 2, 3], [5], key=lambda x: 5)

[1, 2, 3]

如果有任何列表元素映射到中不存在的键,则desired_order这些元素将被静默丢弃。例如:


>>> sorted_by([1, 2, 3], [1, 2, 3], key=lambda x: 5)

[]

也可以看看:


defaultdict


查看完整回答
反对 回复 2019-10-30
?
慕尼黑5688855

TA贡献1848条经验 获得超2个赞

另一个posibility是进行排序a,对排序索引b根据b与比所述排序a根据索引


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

ind = [i[0] for i in sorted(enumerate(b),key=lambda x: x[1])]

a = [i[0] for i in sorted(zip(a,ind),key=lambda x: x[1])]

由于每次排序都需要n * log(n),因此对于较大的列表仍然可以扩展


查看完整回答
反对 回复 2019-10-30
  • 3 回答
  • 0 关注
  • 748 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信