python 实现简单的列表元素移动

搜了些列表元素移动的方法,结果搜到的方法很少,不符合我想要的效果,自己写一个吧,勉强能用

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))

结果:

  • 5
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值