Python切换元素的顺序

时间:2009-09-15 17:30:18

标签: python

我是新手并且正在寻找Python的禅宗:)今天的koan找到了解决以下问题的最多Pythonesq方法:

  

成对地置换字符串的字母,例如

input:  'abcdefgh'
output: 'badcfehg'

6 个答案:

答案 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的答案,但使用mapizip_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))