我是新手并且正在寻找Python的禅宗:)今天的koan找到了解决以下问题的最多Pythonesq方法:
成对地置换字符串的字母,例如
input: 'abcdefgh' output: 'badcfehg'
答案 0 :(得分:13)
我会去:
s="abcdefgh"
print "".join(b+a for a,b in zip(s[::2],s[1::2]))
s [start:end:step]取每一步的字母,zip将它们成对匹配,循环交换它们,然后连接返回一个字符串。
答案 1 :(得分:6)
我个人最喜欢做成对的事情:
def pairwise( iterable ):
it = iter(iterable)
return zip(it, it) # zipping the same iterator twice produces pairs
output = ''.join( b+a for a,b in pairwise(input))
答案 2 :(得分:5)
''.join(s[i+1] + s[i] for i in range(0,len(s),2))
是的,我知道使用范围不是pythonic,但它很短,我可能不需要解释它来弄清楚它的作用。
答案 3 :(得分:2)
我刚注意到,如果输入的长度为奇数,则现有答案的 none 有效。大多数答案都失去了最后一个字符。我之前的回答引发了异常。
如果你只是希望将最后一个角色添加到最后,你可以这样做:
print "".join(map(lambda a,b:(b or '')+a, s[::2], s[1::2]))
或2.6及更高版本:
print "".join(b+a for a,b in izip_longest(s[::2],s[1::2], fillvalue=''))
这是基于Anthony Towns的答案,但使用map
或izip_longest
来确保奇数长度字符串中的最后一个字符不会被丢弃。 (b or '')
版本中的map
位用于将None
map
个''
转换为{{1}}。
答案 4 :(得分:1)
因为在Python中,每个字符串也是可迭代的,itertools在这里派上用场。
除了itertools提供的功能外,文档还提供了大量的配方。
from itertools import izip_longest
# From Python 2.6 docs
def grouper(n, iterable, fillvalue=None):
"grouper(3, 'ABCDEFG', 'x') --> ABC DEF Gxx"
args = [iter(iterable)] * n
return izip_longest(fillvalue=fillvalue, *args)
现在你可以使用grouper按字符串对字符串进行分组,然后反转这些字符串,然后将它们连接回字符串。
pairs = grouper(2, "abcdefgh")
reversed_pairs = [''.join(reversed(item)) for item in pairs]
print ''.join(reversed_pairs)
答案 5 :(得分:0)
这可能看起来有点可怕,但我认为你已经学到了很多解读以下习语:
s = "abcdefgh"
print ''.join(b+a for a,b in zip(*[iter(s)]*2))