搜了些列表元素移动的方法,结果搜到的方法很少,不符合我想要的效果,自己写一个吧,勉强能用
class ListMove(Enum):
moveToretain = 'moveToretain' #移动并保留所要移动至对应位置的元素
moveTodelete = 'moveTodelete' #移动至对应位置后去除之前在该位置的元素
moveToafter = 'moveToafter' #移动至对应位置的元素之后
moveToprevious = 'moveToprevious' #移动至对应位置的元素之前
Index = 'Index' #按索引进行移动
Elements = 'Elements' #按元素名称进行移动
def listmove(source_list:Union[list],
move_obj:Union[int, str, list],
moveto:Union[int, str],
mode:Union[ListMove, list, tuple] = ListMove.moveToretain,
relative_position:Union[ListMove] = ListMove.moveToafter)->list:
"""source_list 待修改列表,
move_obj 需要移动的对象,
moveto 需要移动至(可以是索引也可以是元素),
mode ListMove参数
move_to_position ListMove参数"""
spacing = '\y'
spacing_cahr = f"{spacing}".join([item for item in source_list if item not in move_obj])
if type(move_obj) == str:
move_obj = [move_obj]
if ListMove.Index in mode:
move_obj = [source_list[index] for index in move_obj]
moveto = source_list[moveto]
if ListMove.moveToretain in mode:
if ListMove.moveToafter == relative_position:
replace_char = f"{moveto}{spacing}{f'{spacing}'.join([obj for obj in move_obj])}"
else:
replace_char = f"{f'{spacing}'.join([obj for obj in move_obj])}{spacing}{moveto}"
else:
replace_char = f"{f'{spacing}'.join([obj for obj in move_obj])}"
return spacing_cahr.replace(moveto, replace_char).split(spacing)
效果: 演示列表-> my_test = ['aaa', 'bbb', 'ccc', 'ddd', 'eee', 'fff', 'ggg', 'hhh', 'iii', 'jjj', 'kkk', 'lll', 'mmm', 'nnn', 'ooo', 'ppp']
单个元素移动: 'ccc' 移动至 kkk之前和之后
print(listmove(my_test, 'ccc', 'kkk', relative_position=ListMove.moveToprevious))
print(listmove(my_test, 'ccc', 'kkk', relative_position=ListMove.moveToafter))
结果:
多个元素移动: 'ccc', 'eee', 'fff' 移动至 nnn之前和之后
print(listmove(my_test, ['ccc', 'eee', 'fff'], 'nnn', relative_position=ListMove.moveToprevious))
print(listmove(my_test, ['ccc', 'eee', 'fff'], 'nnn', relative_position=ListMove.moveToafter))
结果:
移动后不保留所移动位置的元素 'ccc', 'eee', 'fff' 移动至 nnn之前和之后
不保留的:: print(listmove(my_test, ['ccc', 'eee', 'fff'], 'nnn',mode=[ListMove.Elements, ListMove.moveTodelete], relative_position=ListMove.moveToprevious))
保留的: print(listmove(my_test, ['ccc', 'eee', 'fff'], 'nnn', relative_position=ListMove.moveToafter))
结果:
按索引移动: 2, 4, 6索引元素移动至 8索引元素之前和之后
print(listmove(my_test, [2, 4, 6], 8, mode=[ListMove.Index, ListMove.moveTodelete], relative_position=ListMove.moveToprevious))
print(listmove(my_test, [2, 4, 6], 8, mode=[ListMove.Index, ListMove.moveToretain], relative_position=ListMove.moveToafter))
结果: