【问题标题】:Swapping two characters in a string and store the generated strings in a list in Python交换字符串中的两个字符并将生成的字符串存储在 Python 中的列表中
【发布时间】:2026-01-11 11:50:01
【问题描述】:

我想交换字符串中的每两个字符并将输出存储在一个列表中(以便稍后检查每个字符串是否存在于字典中)

我见过一些代码可以同时交换所有字符,但这不是我想要的。

例如:

var = 'abcde'

预期输出:

['bacde','acbde','abdce','abced']

如何在 Python 中做到这一点?

【问题讨论】:

    标签: python string python-3.x list


    【解决方案1】:

    您可以使用以下列表理解表达式来实现此目的:

    >>> var = 'abcde'
    
    #                         v To reverse the substring
    >>> [var[:i]+var[i:i+2][::-1]+var[i+2:] for i in range(len(var)-1)]
    ['bacde', 'acbde', 'abdce', 'abced']
    

    【讨论】:

      【解决方案2】:

      假设您预期的输出列表中的最后一个条目是一个错字,并且它应该是'abced' 以保持模式继续,那么这是一种方法(不确定它是否根据您的用例正确概括):

      In [5]: x
      Out[5]: 'abcde'
      
      In [6]: [x[:i] + x[i+1] + x[i] + x[i+2:] for i in range(len(x)-1)]
      Out[6]: ['bacde', 'acbde', 'abdce', 'abced']
      

      【讨论】:

        【解决方案3】:

        生成器函数不会为较长的字符串使用太多内存:

        def swap_pairs(s):
            for i in range(len(s) - 1):
                yield s[:i] + s[i + 1] + s[i] + s[i + 2:]
        
        >>> swap_pairs('abcde')
        <generator object swap_pairs at 0x1034d0f68>
        >>> list(swap_pairs('abcde'))
        ['bacde', 'acbde', 'abdce', 'abced']
        

        【讨论】:

          【解决方案4】:

          这是re 方法:

          x = 'abcde'
          [re.sub(f'(.)(.)(?=.{{{i}}}$)', "\\2\\1", x) for i in reversed(range(len(x)-1))]
          # ['bacde', 'acbde', 'abdce', 'abced']
          

          还有一个跳过双字符的变体:

          x = 'abbde'
          [s for s, i in (re.subn(f'(.)(?!\\1)(.)(?=.{{{i}}}$)', "\\2\\1", x) for i in reversed(range(len(x)-1))) if i]
          # ['babde', 'abdbe', 'abbed']
          

          【讨论】:

          • reversed(range(len(x)-1)) ?我会改用range(len(x)-1,-1,-1) 之类的东西
          • @Jean-FrançoisFabre ... 并迅速落入其中一个陷阱。 range(len(x)-2, -1, -1) 如果我没记错的话应该是等价的。这就是为什么我经常发现 `reversed` 更具可读性。
          • 是的,我没有测试您的解决方案。但我不喜欢在range 上使用reversed(代码打高尔夫球习惯?)
          • @Jean-FrançoisFabre 我对这两种方法都很好。代码高尔夫球手是否对反向范围皱眉?考虑到range 对象具有返回range_iterator__reversed__ 方法,它们似乎得到了官方认可,因此与手动反转范围相比,这应该不会慢很多。
          • 我认为他们不在乎速度。他们关心代码长度。