我想交换一个字符串中的每两个字符并将输出存储在一个列表中(以便稍后检查每个字符串是否存在于字典中)
我见过一些代码可以同时交换字符,但这不是我想要的。
例如:
var = 'abcde'
预期产出:
['bacde','acbde','abdce','abced']
我怎样才能在Python中执行此操作?
答案 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']