我想要交换字符串中每一对字符的位置。例如将
在Python中要如何实现?
'2143'
变为'1234'
,将'badcfe'
变为'abcdef'
。在Python中要如何实现?
s = '2143'
p=list(s)
p.sort()
s = "".join(p)
s现在是'1234'。这里的技巧是将list(string)分解为字符。
像这样:
>>> 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'
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"))
另一种方法:
>>> s='123456'
>>> ''.join([''.join(el) for el in zip(s[1::2], s[0::2])])
'214365'
>>> 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
虽然上述解决方案可以解决问题,但有一个非常简单的解决方案,也可以用“小白”语言来表述。仍在学习 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 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))
基本上只需要一行代码,不需要任何迭代器超出索引范围,以及一些非常简单的整数运算。
交换字符串中前两个字符的最简单方式之一是:
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)
#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)
#Think about how index works with string in Python,
>>> a = "123456"
>>> a[::-1]
'654321'
''.join(sorted(s))
,而且同样清晰易懂。 - Daniel DiPaolo