重新排列字符串列表

布赫兹

我想重新排列或修改列表中的元素(字符串)序列。这是原始列​​表

['A', 'B', 'C', 'D', 'E', 'F', 'G']

我想移动EF后面(或之后?)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
卡尔·克内赫特尔
  1. .remove当目标是从特定位置擦除时不要使用;尽管您可能知道该位置的内容,但.removea) 将再次搜索它,并且 b) 删除第一个匹配项,这不一定是您的想法。

  2. 如果要删除多个连续元素,请不要一次删除一个元素;这就是切片存在的原因,以及del操作员按其方式工作的原因。当您可以直接说出您想要的内容时,不仅已经很难进行迭代,而且您必须注意在迭代列表时修改列表的常见问题。

  3. 如果要添加多个连续的元素,请不要一次添加一个元素;相反,通过 slice assignment 一次性插入它们同样的原因也适用于此。

  4. 特别是不要尝试交错插入和删除操作。这比必要的复杂得多,如果插入位置与源位置重叠,可能会导致问题。

因此:

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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章