用Python交换字符串中相邻字符对的最简单方法是什么?

30
我想要交换字符串中每一对字符的位置。例如将'2143'变为'1234',将'badcfe'变为'abcdef'
在Python中要如何实现?
20个回答

0
你想要数字排序吗?还是交换奇偶索引的数字?你的例子完全不清楚。
排序:
s = '2143'
p=list(s)
p.sort()
s = "".join(p)

s现在是'1234'。这里的技巧是将list(string)分解为字符。


1
作为指南,更加简洁的做法是 ''.join(sorted(s)),而且同样清晰易懂。 - Daniel DiPaolo
抱歉,我想要交换字符串中每两个字符的位置。 - cocobear
我总是忘记 sorted(x)!谢谢。 - Spacedman

0

像这样:

>>> s = "2143658709"
>>> ''.join([s[i+1] + s[i] for i in range(0, len(s), 2)])
'1234567890'

>>> s = "badcfe"
>>> ''.join([s[i+1] + s[i] for i in range(0, len(s), 2)])
'abcdef'

0
re.sub(r'(.)(.)',r"\2\1",'abcdef1234')

然而 re 速度有点慢。

def swap(s):
    i=iter(s)
    while True:
        a,b=next(i),next(i)
        yield b
        yield a

''.join(swap("abcdef1234"))

0

另一种方法:

>>> s='123456'
>>> ''.join([''.join(el) for el in zip(s[1::2], s[0::2])])
'214365'

0
>>> import ctypes
>>> s = 'abcdef'
>>> mutable = ctypes.create_string_buffer(s)
>>> for i in range(0,len(s),2):
>>>     mutable[i], mutable[i+1] = mutable[i+1], mutable[i]
>>> s = mutable.value
>>> print s
badcfe

如果字符串包含非ASCII字符会发生什么? - Cristian Ciupitu

0

虽然上述解决方案可以解决问题,但有一个非常简单的解决方案,也可以用“小白”语言来表述。仍在学习 Python 和字符串的人可以使用其他答案,但如果没有发布者的完整解释,他们不会真正理解它们是如何工作或代码的每个部分是做什么的,只会知道 “这行管用”。以下是交换字符串中每个第二个字符的代码,对于初学者来说很容易理解。

它只是通过两个一组(从 0 开始并查找每个第二个字符)迭代遍历字符串(任何长度),然后通过添加当前索引+1(第二个字符)和实际索引(第一个字符)创建一个新字符串(swapped_pair),例如,将索引 1 放置在索引 0 中,然后将索引 0 放置在索引 1 中,并通过字符串的迭代重复此过程。

还添加了代码以确保字符串长度为偶数,因为它仅适用于偶数长度。

DrSanjay Bhakkad 上面的帖子也很好,适用于奇数或偶数字符串,并且基本上执行与下面相同的函数。

string = "abcdefghijklmnopqrstuvwxyz123"

# use this prior to below iteration if string needs to be even but is possibly odd
if len(string) % 2 != 0:
    string = string[:-1]

# iteration to swap every second character in string
swapped_pair = ""
for i in range(0, len(string), 2):
    swapped_pair += (string[i + 1] + string[i])

# use this after above iteration for any even or odd length of strings
if len(swapped_pair) % 2 != 0:
    swapped_adj += swapped_pair[-1]

print(swapped_pair)

badcfehgjilknmporqtsvuxwzy21 # output if the "needs to be even" code used
badcfehgjilknmporqtsvuxwzy213 # output if the "even or odd" code used

小心命名任何变量为string。这总是与Python提供的本地字符串库发生冲突。 - Fusion

0
有点晚了,但实际上有一种非常简单的方法可以做到这一点:
您要查找的索引序列可以表示为两个序列的和:
 0  1  2  3 ...
+1 -1 +1 -1 ...

两者都很容易表达。第一个只是range(N)。在该范围内,每个i切换的序列为i%2。您可以通过缩放和偏移来调整切换:
         i % 2      ->  0  1  0  1 ...
     1 - i % 2      ->  1  0  1  0 ...
2 * (1 - i % 2)     ->  2  0  2  0 ...
2 * (1 - i % 2) - 1 -> +1 -1 +1 -1 ...

整个表达式简化为i + 1 - 2 * (i%2),您可以几乎直接使用它来连接字符串:
result = ''.join(string[i + 1 - 2 * (i % 2)] for i in range(len(string)))

这仅适用于偶数长度的字符串,因此您可以使用min检查超限:
N = len(string)
result = ''.join(string[min(i + 1 - 2 * (i % 2), N - 1)] for i in range(N))

基本上只需要一行代码,不需要任何迭代器超出索引范围,以及一些非常简单的整数运算。


-1

交换字符串中前两个字符的最简单方式之一是:

inputString = '2134'

extractChar = inputString[0:2]
swapExtractedChar = extractChar[::-1]          """Reverse the order of string"""
swapFirstTwoChar = swapExtractedChar + inputString[2:]
 
# swapFirstTwoChar = inputString[0:2][::-1] + inputString[2:]     """For one line code"""

print(swapFirstTwoChar)

-2
#Works on even/odd size strings
str = '2143657'
newStr = ''
for i in range(len(str)//2):
    newStr += str[i*2+1] + str[i*2]
if len(str)%2 != 0:
    newStr += str[-1]
print(newStr)

1
欢迎来到Stack Overflow!虽然这段代码片段可能解决了问题,但是包括解释如何为什么解决问题会非常有帮助,以提高您的帖子质量。请记住,您正在回答未来读者的问题,而不仅仅是现在提问的人!请[编辑]您的答案以添加解释,并指出适用的限制和假设。 - Toby Speight

-3
#Think about how index works with string in Python,
>>> a = "123456"
>>> a[::-1]
'654321'

1
这不是提问者想要的 - 请查看他们的示例。 - Shadow

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接