我想重新排列或修改列表中的元素(字符串)序列。这是原始列表
['A', 'B', 'C', 'D', 'E', 'F', 'G']
我想移动E
到F
后面(或之后?)B
。
['A', 'B', 'E', 'F', 'C', 'D', 'G']
^^^ ^^^
移动什么由用户决定。背后没有规则,也无法在算法中制定规则。换句话说,动作将某物移到某物后面是用户输入的;例如,用户用她/他的鼠标标记两个元素并将其拖放到另一个元素后面。
我的代码有效并且能够做到这一点。但我想知道是否有更有效和 pythonic 的方式来做到这一点。也许我错过了 Python 的一些不错的内置功能。
#!/usr/bin/env python3
# input data
original = list('ABCDEFG')
# move "EF" behind "B" (this is user input)
to_move = 'EF'
behind = 'B'
# expected result
rearanged = list('ABEFCDG')
# index for insertion
idx_behind = original.index(behind)
# each element to move
for c in reversed(to_move): # "reverse!"
# remove from original position
original.remove(c)
# add to new position
original.insert(idx_behind + 1, c)
# True
print(original == rearanged)
你可以假设
original
是独一无二的。to_move
始终存在于original
.behind
始终存在于original
.to_move
总是相邻的。其他可能的输入示例:
['B']
向后移动F
['A', 'B']
向后移动C
这是不可能的:
['A', 'F']
向后移动D
.remove
当目标是从特定位置擦除时不要使用;尽管您可能知道该位置的内容,但.remove
a) 将再次搜索它,并且 b) 删除第一个匹配项,这不一定是您的想法。
如果要删除多个连续元素,请不要一次删除一个元素;这就是切片存在的原因,以及del
操作员按其方式工作的原因。当您可以直接说出您想要的内容时,不仅已经很难进行迭代,而且您必须注意在迭代列表时修改列表的常见问题。
如果要添加多个连续的元素,请不要一次添加一个元素;相反,通过 slice assignment 一次性插入它们。同样的原因也适用于此。
特别是不要尝试交错插入和删除操作。这比必要的复杂得多,如果插入位置与源位置重叠,可能会导致问题。
因此:
original = list('ABCDEFG')
start = original.index('E')
# grabbing two consecutive elements:
to_move = original[start:start+2]
# removing them:
del original[start:start+2]
# now figure out where to insert in that result:
insertion_point = original.index('B') + 1
# and insert:
original[insertion_point:insertion_point] = to_move
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句