簡體   English   中英

使用另一個列表中的部分匹配對列表進行排序

[英]Sort a list using a partial match in another list

考慮這個列表。

input_list = ['Saturday', 'Tuesday', 'Sunday', 'Monday', 'Thursday', 'Wednesday', 'Cheeseburger', 'Friday']

我想根據第二個列表的部分匹配對其進行排序。

list_sorter = ['Mon', 'Tue', 'Wed']

以便

output_list = ['Monday', 'Tuesday', 'Wednesday', 'Cheeseburger', 'Friday', 'Saturday', 'Sunday','Thursday']

將排序列表存儲到 input_list 是首選。 提前感謝您的幫助。

編輯:

我試過sorted(input_list, key = list_sorter.index)

哪些錯誤。

ValueError:“星期六”不在列表中

我試過sorted(input_list, key = lambda x: x in list_sorter)

這也是不正確的。

編輯 2:不應假定文本位於單詞的開頭。 抱歉編輯晚了,直到我看到回復才想到。

list_sorter = ['Mon', 'Tue', 'rida']
output_list = ['Monday', 'Tuesday','Friday','Cheeseburger', 'Saturday', 'Sunday','Thursday','Wednesday']

當 list_sorter 有部分匹配時,也應該支持。

您可以構造一個字典映射,然后使用sorteddict.__getitem__ 這很好用,因為sorted是一種穩定的排序算法

sort_map = {day: next((idx for idx, val in enumerate(list_sorter) if val in day),
                 len(input_list)) for day in input_list}

res = sorted(input_list, key=sort_map.__getitem__)

['Monday', 'Tuesday', 'Friday', 'Saturday', 'Sunday',
 'Thursday', 'Wednesday', 'Cheeseburger']

首先在O(len(list_sorter)+len(input_list))中制作一個帶有排序信息的字典:

order=dict.fromkeys([x[:3] for x in input_list],len(list_sorter))
order.update({k:v for (v,k) in enumerate(list_sorter)})
#{'Sat': 3, 'Tue': 1, 'Sun': 3, 'Mon': 0, 'Thu': 3, 'Wed': 2, 'Che': 3, 'Fri': 3}

然后排序:

res=sorted(input_list, key = lambda x : (order[x[:3]],x[:3]))
#['Monday', 'Tuesday', 'Wednesday', 'Cheeseburger', 'Friday', \
#  'Saturday', 'Sunday', 'Thursday']  

未覆蓋的單詞在最后,按字母順序排列。

我不確定您如何獲得列表中未排序項目的順序,所以我假設它們是未排序的。

這是一個例子:

        input_list = ['Saturday', 'Tuesday', 'Sunday', 'Monday', 'Thursday', 'Wednesday', 'Cheeseburger', 'Friday']
        list_sorter = ['Mon', 'Tue', 'Wed']
        list_sorter.reverse()
        tupple_list = []
        for element in input_list:
            sub_string = element[0:3]
            if sub_string in list_sorter:
                index = list_sorter.index(sub_string) + 1
            else:
                index = 0
            tupple_list.append((element, index))
        sorted_list = sorted(tupple_list, key=lambda x: x[1], reverse = True)
        output_list = []
        for tupple in sorted_list:
            output_list.append(tupple[0])
        print (output_list)

給予:

['Monday', 'Tuesday', 'Wednesday', 'Saturday', 'Sunday', 'Thursday', 'Cheeseburger', 'Friday']
from functools import partial

def keysort(value, lOrder):
    index = 10000
    for i, pmatch in enumerate(lOrder, 1):
        if value.upper().find(pmatch.upper())!=-1:
            index=i
            break
    return index

def main():
    list_sorter = ['Mon', 'Tue', 'rida']
    output_list = ['Thursday', 'Saturday', 'Tuesday', 'Friday', 'Cheeseburger', 'Monday', 'Sunday', 'Wednesday']
    slist = sorted(output_list, key=partial(keysort, lOrder=list_sorter))
    print (slist)
#['Monday', 'Tuesday', 'Friday', 'Thursday', 'Saturday', 'Cheeseburger', 'Sunday', 'Wednesday']
if __name__ == '__main__':
    main()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM