我想在一个字符串中交换每两个字符并将输出存储在一个列表中(以便稍后检查每个字符串是否存在于字典中)
我已经看到一些代码可以同时交换字符,但这不是我想要的。
例如:
var = 'abcde'
预期产量:
['bacde','acbde','abdce','abced']
我怎么能用Python做到这一点?
您可以使用下面的列表理解表达式来实现此目的:
>>> 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']
假设您的预期输出列表中的最终条目是一个拼写错误,并且它应该是'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']
对于较长的字符串,生成器函数不会使用太多内存:
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']
这是一个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']