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

问题描述 投票:4回答:4

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

我已经看到一些代码可以同时交换字符,但这不是我想要的。

例如:

var = 'abcde'

预期产量:

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

我怎么能用Python做到这一点?

python string python-3.x list
4个回答
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']

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
投票

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

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

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']
© www.soinside.com 2019 - 2024. All rights reserved.