在Python中交换字符串中的每秒字符

时间:2011-10-26 08:23:25

标签: python string list

我有以下问题:我想在Python中编写一个函数,给定一个字符串,返回字符串,其中每组两个字符被交换

例如,给定“ABCDEF”,它返回“BADCFE”。

字符串的长度将保证为偶数。

你能帮我解决一下如何用Python做的事吗?

7 个答案:

答案 0 :(得分:3)

添加其他选项:

>>> s = 'abcdefghijkl'
>>> ''.join([c[1] + c[0] for c in zip(s[::2], s[1::2])])
'badcfehgjilk'

答案 1 :(得分:2)

import re
print re.sub(r'(.)(.)', r'\2\1', "ABCDEF")

答案 2 :(得分:1)

from itertools import chain, izip_longest

''.join(chain.from_iterable(izip_longest(s[1::2], s[::2], fillvalue = '')))

如果您有非常大的字符串或只是想避免复制,您也可以使用islice代替常规切片。

适用于奇数长度的字符串,即使这不是问题的要求。

答案 3 :(得分:0)

这是一个很好的解决方案:

def swapem (s):
    if len(s) < 2: return s
    return "%s%s%s"%(s[1], s[0], swapem (s[2:]))

for str in ("", "a", "ab", "abcdefgh", "abcdefghi"):
    print "[%s] -> [%s]"%(str, swapem (str))

虽然可能不适合字符串: - )

输出是:

[] -> []
[a] -> [a]
[ab] -> [ba]
[abcdefgh] -> [badcfehg]
[abcdefghi] -> [badcfehgi]

答案 4 :(得分:0)

如果您更喜欢单行:

''.join(reduce(lambda x,y: x+y,[[s[1+(x<<1)],s[x<<1]] for x in range(0,len(s)>>1)]))

答案 5 :(得分:0)

这是另一个简单的解决方案:

"".join([(s[i:i+2])[::-1]for i in range(0,len(s),2)])

答案 6 :(得分:0)

虽然上述解决方案确实有效,但我们有一个非常简单的解决方案应该用“外行”的术语来说。仍在学习python和string的人可以使用其他答案,但是如果没有海报者的完整解释而不是“这是可行的”,他们还无法真正理解其工作方式或代码的每个部分在做什么。下面的代码执行字符串中每个第二个字符的交换,对于初学者来说很容易理解它的工作原理。

它只是简单地遍历字符串(任意长度)两次(从0开始,找到第二个字符),然后通过添加当前索引+ 1(第二个字符),然后再加上实际值来创建新的字符串(交换对)索引(第一个字符),例如,将索引1放在索引0处,然后将索引0放在索引1处,这会在字符串的迭代过程中重复进行。

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

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