【发布时间】:2014-01-30 11:13:19
【问题描述】:
我需要反转一个交错的字符串,这意味着我有 2 对不应该像这样搞砸:
>>> interleaved = "123456"
倒车
>>> print interleaved[::-1]
654321
但我真正想要的是
563412
这个有字符串切片操作吗?
【问题讨论】:
我需要反转一个交错的字符串,这意味着我有 2 对不应该像这样搞砸:
>>> interleaved = "123456"
倒车
>>> print interleaved[::-1]
654321
但我真正想要的是
563412
这个有字符串切片操作吗?
【问题讨论】:
据我所知,最短的方法是使用正则表达式:
import re
''.join(re.findall('..?', '123456', flags=re.S)[::-1])
这也适用于奇数长度的字符串,而无需为它们实现单独的逻辑。
【讨论】:
对于偶数长度的字符串,应该这样做:
>>> s = "123456"
>>> it = reversed(s)
>>> ''.join(next(it) + x for x in it)
'563412'
对于奇数长度的字符串,您需要单独在第一个字符前添加:
>>> s = "7123456"
>>> it = reversed(s)
>>> (s[0] if len(s)%2 else '') + ''.join(next(it) + x for x in it)
'7563412'
使用切片和zip:
>>> s = "7123456"
>>> (s[0] if len(s)%2 else '') + ''.join(x+y for x, y in zip(s[-2::-2], s[::-2]))
'7563412'
【讨论】:
next(it) + x for x in it。我理解 next 和 for 循环表达式,但完整的表达式对我来说很棘手。
reversed 返回一个反向迭代器。现在在迭代期间,for 循环将在此迭代器上调用 next,但由于我们还需要下一项,所以我们在循环内再调用一个额外的 next 以获取下一项。因此,在第一次迭代中,x 将获取 '6' 和 next(x) 将返回 '5' 等等......
>>> for x in it: next(it) + x,现在很清楚了。谢谢!
reversed 迭代器知道 unicode 字符串,或者您实际上没有反转 unicode 字符串。这些是具有组合字符等的不同野兽,需要以不同的方式处理,而不仅仅是颠倒所有单个字符的顺序。
您可以将几个想法带到split a string in pieces,然后将每个部分反转并重新组合(加入)反转的列表。
例如(以不那么可读的方式使用 satomacoto 答案...)
''.join([a[::-1][i:i+2][::-1] for i in range(0, len(a), 2)])
或(使用 F.J. 答案)
''.join(map(''.join, zip(*[iter(a)]*2))[::-1])
等等。 (成为a 你的字符串)。
【讨论】:
[iter(a)] 中的[ ] 需要什么(*[iter(a)]*2) 能帮我解释一下吗?
zip(*[iter(s)]*n) work in Python?