Сортировать список, используя частичное совпадение в другом списке - PullRequest
0 голосов
/ 10 декабря 2018

Рассмотрим этот список.

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 голосов
/ 10 декабря 2018

Вы можете создать отображение словаря, затем использовать sorted с dict.__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']
0 голосов
/ 10 декабря 2018

Сначала создайте словарь с информацией для сортировки в 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']  

В конце не указаны слова в алфавитном порядке.

0 голосов
/ 10 декабря 2018

Я не уверен, как вы получаете порядок несортированных элементов в вашем списке, поэтому я предполагаю, что они не отсортированы.

Вот пример:

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