【问题标题】:Python move multiple elements in a listPython在列表中移动多个元素
【发布时间】:2019-03-18 17:56:48
【问题描述】:

如果从某个索引开始有空格,我需要移动列表中的元素,移动元素右侧的元素不能从它们的索引移动,一个演示:

# desired output
["not end","x","y","","","","don't move"]


# works here
l = ["not end","","","","x","y","don't move"]
start = 1
aext_len = 3
end = start + aext_len + 1

for empty, cell in enumerate(l[start:end - 1], 1):
    if cell:
        break

for z in range(aext_len + 2 - empty):
    l.insert(start + z, l.pop(start + empty + z))
print (l)
#['not end', 'x', 'y', '', '', '', "don't move"]


# not here
l = ["not end","","x","y","","","don't move"]
start = 1
aext_len = 3
end = start + aext_len + 1

for empty, cell in enumerate(l[start:end - 1], 1):
    if cell:
        break

for z in range(aext_len + 2 - empty):
    l.insert(start + z, l.pop(start + empty + z))
print (l)
#['not end', 'y', '', '', '', 'x', "don't move"]

【问题讨论】:

    标签: python python-3.x list slice


    【解决方案1】:

    解决方案实际上要简单得多。

    l = ["not end", "", "", "", "x", "y", "don't move"]
    

    定义“请勿移动”区域的末端:

    MOVE = 6
    

    “挤出”空字符串:

    part1 = [x for x in l[:MOVE] if x]
    

    将“挤出”的空字符串移到末尾:

    part2 = (MOVE - len(part1)) * [""]
    

    组合碎片:

    part1 + part2 + l[MOVE:]
    #['not end', 'x', 'y', '', '', '', "don't move"]
    

    或者,您可以通过为空字符串的属性对列表的第一部分进行排序:

    sorted(l[:MOVE], key=lambda x: x=="") + l[MOVE:]
    #['not end', 'x', 'y', '', '', '', "don't move"]
    

    【讨论】:

    • 如果不是太麻烦的话,根据右侧空单元格向右移动元素的代码会不会有很大不同? :P 你不必回答那个
    • @citizen2077 把part1和part2的顺序改一下就行了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-10-23
    • 1970-01-01
    • 2021-12-13
    • 1970-01-01
    相关资源
    最近更新 更多