【问题标题】:Swapping pairs of characters in a string交换字符串中的字符对
【发布时间】:2025-12-17 15:50:01
【问题描述】:

好的,我真的是 Python 新手,不知道该怎么做:

我需要获取一个字符串,例如“ABAB__AB”,将其转换为列表,然后获取我要移动的对的前导索引,并将该对与 __ 交换。我认为输出应该是这样的:

move_chars('ABAB__AB', 0) '__ABABAB'

还有一个例子:

move_chars('__ABABAB', 3) 'BAA__BAB'

老实说,不知道该怎么做。

【问题讨论】:

  • 您是否有任何不想要的结果的初步尝试?
  • 我已经尝试了几次。但我真的不知道从哪里开始。我试过了: def move_chars(state, pos): s = list(state) 真的我不知道我在做什么。

标签: python string list python-3.x swap


【解决方案1】:

Python 字符串是不可变的,因此您不能真正修改字符串。相反,您创建一个新字符串。

如果您希望能够修改字符串中的单个字符,可以将其转换为字符列表,对其进行处理,然后将列表重新连接成字符串。

chars = list(str)
# work on the list of characters
# for example swap first two
chars[0], chars[1] = chars[1], chars[0]
return ''.join(chars)

【讨论】:

  • 所以使用 .pop() 和 .append() 之类的命令来移动字符对吗?但是我如何让对移动呢?即取位置 0 和 1 的字符,然后将它们与 3 和 4 中的字符交换?
  • @TownofRavens 您可能需要重新考虑您的数据结构。如果您要在成对的字母之间移动,尤其是多次移动,那么也许您应该坚持使用列表。
  • @TownofRavens 如果你只想做一些交换,你应该使用索引,chars[0], chars[3] = chars[3], chars[0]; chars[1], chars[4] = chars[4], chars[1]
  • 感谢两位的帮助。我会把你们俩说的话结合起来。
【解决方案2】:

我觉得这个应该去评论区,但是因为没有名气,不能评论,所以……

您可能希望坚持使用列表索引交换,而不是使用.pop().append().pop()可以从任意索引中删除元素,但一次只能删除一个,.append()只能添加到列表的末尾。所以它们是相当有限的,而且在这类问题中使用它们会使你的代码复杂化。

所以,最好坚持使用索引进行交换。

【讨论】:

    【解决方案3】:

    诀窍是使用列表切片来移动部分字符串。

    def move_chars(s, index):
        to_index = s.find('__')                # index of destination underscores
        chars = list(s)                        # make mutable list
        to_move = chars[index:index+2]         # grab chars to move
        chars[index:index+2] = '__'            # replace with underscores
        chars[to_index:to_index+2] = to_move   # replace underscores with chars
        return ''.join(chars)                  # stitch it all back together
    
    print(move_chars('ABAB__AB', 0))
    print(move_chars('__ABABAB', 3))
    

    【讨论】:

    • 非常感谢!我现在明白了。