从头到尾切一串

时间:2019-05-28 16:51:50

标签: python slice

我正在尝试对字符串执行回文切片,并将字符串的正向版本与字符串的反向版本进行比较

string = "nitin"
i = 0
j = len(string)

while i<j:
    if string[i:j] == string[j-1:i-1:-1]:
        print("".join(string[i:j]))
    i +=1 
    j-=1 

但是我发现string [end:start-1:-1]方法不接受诸如string [4:-1:-1]之类的参数。我理解为什么(因为索引-1与字符串的开头相同),但是我不知道如何结合使用列表切片和我的方法来克服此问题。

(我的意思是每次都可以缩短字符串,但我希望能够使用列表切片来解决我的问题),如下所示:

string = "nitin"
i = 0
j = len(string)

while i+1<j:
    string=string[i:j]
    if string == string[::-1]:
        print(string)
    i +=1 
    j-=1 

有什么想法吗? 谢谢

编辑 我想要所有可能的次回文序列 (例如:nitin会产生nitin,iti)

4 个答案:

答案 0 :(得分:1)

如果要检查是否为字符串回文,则只需使用reversed函数:

''.join(reversed(string)) == string

您还可以在循环中使用reversed,因为它返回迭代器:

  

返回一个反向迭代器。 seq必须是具有 reverse ()方法或支持序列协议( len ()方法和 getitem ()方法)的对象。整数参数从0开始)。

答案 1 :(得分:1)

您可以使用递归获取所有子回文。结果是set,以便删除所有重复的次回文。

def sub_palindromic(s):
    if len(s) <= 1:
        return set()
    elif len(s) == 2:
        if s[::-1] == s:
            return set([s])
        else:
            return set()
    else:
        if s[::-1] == s:
            return set([s]) | sub_palindromic(s[1:]) | sub_palindromic(s[:-1])
        else:
            return sub_palindromic(s[1:]) | sub_palindromic(s[:-1]) | sub_palindromic(s[:2]) | sub_palindromic(s[-2:])

sub_palindromic('nitin') # {'nitin', 'iti'}
sub_palindromic('abca') # set()
sub_palindromic('abab') # {'bab', 'aba'}
sub_palindromic('abba') # {'abba', 'bb'}
sub_palindromic("aaaaa") # {'aa', 'aaa', 'aaaa', 'aaaaa'}
sub_palindromic('abcbacab') # {'abcba', 'aca', 'bacab', 'bcb'}
sub_palindromic("1122bb2211") # {'11', '1122bb2211', '122bb221', '22', '22bb22', '2bb2', 'bb'}

答案 2 :(得分:0)

为什么不仅仅将[::-1]和常规数组切片结合起来?

In [2]: a = [1,2,3,4,5,6]
In [4]: a[::-1]
Out[4]: [6, 5, 4, 3, 2, 1]
In [13]: a[::-1][:5]
Out[13]: [6, 5, 4, 3, 2]

所以我想如果您将其应用于可变长度的字符串

In [14]: f = 'pallapi'

In [15]: f[::-1][1:]
Out[15]: 'pallap'

In [16]: f[::-1][1:] == f[:-1]
Out[16]: True

答案 3 :(得分:0)

你可以做

>>> foo = 'abcde'
>>> foo[::-1]
 'edcba'
>>> bar = 'nidin'
>>> bar == bar[::-1]
True
>>> foo == foo[::-1]
False
>>>