【发布时间】:2026-01-11 11:50:01
【问题描述】:
我想交换字符串中的每两个字符并将输出存储在一个列表中(以便稍后检查每个字符串是否存在于字典中)
我见过一些代码可以同时交换所有字符,但这不是我想要的。
例如:
var = 'abcde'
预期输出:
['bacde','acbde','abdce','abced']
如何在 Python 中做到这一点?
【问题讨论】:
标签: python string python-3.x list
我想交换字符串中的每两个字符并将输出存储在一个列表中(以便稍后检查每个字符串是否存在于字典中)
我见过一些代码可以同时交换所有字符,但这不是我想要的。
例如:
var = 'abcde'
预期输出:
['bacde','acbde','abdce','abced']
如何在 Python 中做到这一点?
【问题讨论】:
标签: python string python-3.x list
您可以使用以下列表理解表达式来实现此目的:
>>> 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']
【讨论】:
reversed(range(len(x)-1)) ?我会改用range(len(x)-1,-1,-1) 之类的东西
range(len(x)-2, -1, -1) 如果我没记错的话应该是等价的。这就是为什么我经常发现 `reversed` 更具可读性。
range 上使用reversed(代码打高尔夫球习惯?)
range 对象具有返回range_iterator 的__reversed__ 方法,它们似乎得到了官方认可,因此与手动反转范围相比,这应该不会慢很多。