使用另一个列表中的部分匹配对列表进行排序

时间:2018-12-10 18:26:43

标签: python list sorting partial

考虑此列表。

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上存在部分匹配时,也应支持。

3 个答案:

答案 0 :(得分:1)

您可以构造字典映射,然后将sorteddict.__getitem__一起使用。因为sortedstable sorting algorithm,所以效果很好。

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

答案 1 :(得分:1)

首先在View中创建带有排序信息的字典:

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}

未覆盖的单词以字母顺序结尾。

答案 2 :(得分:0)

我不确定您如何获取列表中未排序项目的顺序,因此我认为它们是未排序的。

这是一个例子:

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