在字符串中交换两个字符,并将生成的字符串存储在Python的列表中

时间:2017-12-29 14:32:06

标签: python string python-3.x list

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

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

例如:

var = 'abcde'

预期产出:

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

我怎样才能在Python中执行此操作?

4 个答案:

答案 0 :(得分:4)

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

>>> 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']

答案 1 :(得分: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']

答案 2 :(得分:2)

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

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']

答案 3 :(得分:1)

以下是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']