我有以下问题:我想在Python中编写一个函数,给定一个字符串,返回字符串,其中每组两个字符被交换。
例如,给定“ABCDEF”,它返回“BADCFE”。
字符串的长度将保证为偶数。
你能帮我解决一下如何用Python做的事吗?
答案 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