我有大量列表,我知道这些列表将包含几个已知和几个未知(即变化)条目。我现在想以一种预期的条目以预定义的顺序移至开始的方式对列表进行排序,而其他条目则将其推向末端(以其原始顺序或理想情况下,按字母顺序排列)。
例如,我有类似的列表:
l1 = ['Agree', 'Neither agree nor disagree', 'some random answer', 'Strongly agree', 'Disagree', 'Strongly disagree']
l2 = ['Agree', '-99', 'Neither agree nor disagree', 'Strongly agree', 'Disagree', 'Strongly disagree']
l3 = ['Other', 'Agree', 'Neither agree nor disagree', 'Strongly agree', 'Disagree', 'Strongly disagree']
l4 = ['Agree', 'Neither agree nor disagree', 'Strongly agree', 'Disagree', 'Strongly disagree', 'Answer declined']
我希望所有列表以预定义的方式进行排序:
l_out = ['Strongly agree', 'Agree', 'Neither agree nor disagree', 'Disagree', 'Strongly disagree', 'X', 'Y', 'Z']`
用x,y和z代替所有列表中不存在的各种元素。
我找不到一个问题处理此问题并在列表上手动迭代似乎太麻烦了,无法成为最有效的解决方案。任何指针都会很高兴 - 预先感谢您!:)
sorted(list_to_sort, key=ranking_list.index)
其中 ranking_list
包含要元素出现的顺序(即您的问题中的 l_out
)。
您还可以为不在排名列表中的值分配默认行为,但需要一个更复杂的密钥:
rank_list = [...] # Fill as needed
def rank(e, ranking=rank_list):
try:
return ranking.index(e)
except ValueError: # e was not in the ranking list
return len(ranking)
sorted(list_to_sort, key=rank)
>>> l_out = ['Strongly agree', 'Agree', 'Neither agree nor disagree', 'Disagree', 'Strongly disagree']
>>> l1 = ['Agree', 'Neither agree nor disagree', 'some random answer', 'Strongly agree', 'Disagree', 'Strongly disagree']
>>> tmp1 = {k:v for v, k in enumerate(l_out)}
>>> l1.sort(key = lambda x: tmp1.get(x, len(tmp1) + 1))
>>> l1
['Strongly agree', 'Agree', 'Neither agree nor disagree', 'Disagree', 'Strongly disagree', 'some random answer']