第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機(jī)立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何根據(jù)另一個列表對列表進(jìn)行排序?

如何根據(jù)另一個列表對列表進(jìn)行排序?

縹緲止盈 2019-12-15 12:12:46
有一個清單:a = [("ax", 1), ("ec", 3), ("bk", 5)]另一個清單:b = ["ec", "ax", "bk"]我要排序a根據(jù)b:sort_it(a, b)a = [("ec", 3), ("ax", 1), ("bk", 5)]這個怎么做?
查看完整描述

3 回答

?
慕容3067478

TA貢獻(xiàn)1773條經(jīng)驗 獲得超3個贊

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

這a使用b每個元組的第一個元素的index in a作為對其進(jìn)行排序的值就地進(jìn)行排序。


另一種可能更簡潔的書寫方式是:


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

如果您有大量項目,則做一些不同的事情可能會更有效率,因為.index()在長列表上可能是一項昂貴的操作,并且由于您已經(jīng)知道順序,因此實際上不需要進(jìn)行完全排序:


mapping = dict(a)

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

請注意,這僅適用于2元組的列表。如果您希望它適用于任意長度的元組,則需要對其進(jìn)行一些修改:


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

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



查看完整回答
反對 回復(fù) 2019-12-16
?
嗶嗶one

TA貢獻(xiàn)1854條經(jīng)驗 獲得超8個贊

實際上,有一種方法可以在線性O(shè)(n)時間中執(zhí)行此操作,因為這實際上不是排序操作。列表的存在b意味著排序已經(jīng)完成;我們真正需要做的就是重新排列元素的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)]

筆記:


這是一個穩(wěn)定的排序;如果兩個列表項具有相同的鍵,則將保留其順序。例:


>>> 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



查看完整回答
反對 回復(fù) 2019-12-16
?
拉莫斯之舞

TA貢獻(xiàn)1820條經(jīng)驗 獲得超10個贊

另一個posibility是進(jìn)行排序a,對排序索引b根據(jù)b與比所述排序a根據(jù)索引


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),因此對于較大的列表仍然可以擴(kuò)展



查看完整回答
反對 回復(fù) 2019-12-16
  • 3 回答
  • 0 關(guān)注
  • 414 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號