使用另一个列表中的部分匹配对列表进行排序
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: 'Saturday' is not in list
我试过了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 上存在部分匹配时,也应支持。
我不确定你是如何获得列表中未排序项的顺序的,所以我假设它们是未排序的。
这是一个例子:
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']
你可以构造一个字典映射,然后用sorted
和dict.__getitem__
。这很好用,因为 sorted
是 stable 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']
首先用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']
未涵盖的词在最后,按字母顺序排列。
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()
考虑这个列表。
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: 'Saturday' is not in list
我试过了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 上存在部分匹配时,也应支持。
我不确定你是如何获得列表中未排序项的顺序的,所以我假设它们是未排序的。
这是一个例子:
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']
你可以构造一个字典映射,然后用sorted
和dict.__getitem__
。这很好用,因为 sorted
是 stable 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']
首先用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']
未涵盖的词在最后,按字母顺序排列。
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()