python循环移位字符串中的字符

时间:2012-05-31 01:10:19

标签: python subclass

实现“<<”的标准str类型的子类sstr和“>>”方法作为字符串中字符的循环移位。试图做的是

 >>> s1 = sstr("abcde")
 >>> s1 << 0
'abcde'
 >>> s1 >> 0
'abcde'
 >>> s1 << 2
'cdeab'
>>> s1 >> 2
'deabc'
>>> s1 >> 5
 'abcde'

# my attempt:
import string
class sstr(str):
def __new__(self, other):
    return str.__new__(self, other.upper())
def __ilshift__(self, other):
    return str.__ilshift(other)
def __rshift__(self, other):
    return str.__rshift(other)    

2 个答案:

答案 0 :(得分:2)

这有点像家庭作业,所以我不打算在这里发布实际的代码。但是为了提供帮助,我将指出我在您的代码和算法中看到的缺陷:

我的python 2.7.2在__ilshift中报告没有__irshiftstr。此外,如果您尝试将字符串移动一定数量的字符,那么您不应该移动您调用other的变量。您应该将self移动other个字符。话虽这么说,你可能最好将other命名为n或其他一些。

现在,我假设您知道循环移位应该如何工作。您提供的示例可以很好地传达信息。

作为一个简单的算法(易于阅读/理解),试试这个(伪代码如下):

function __ilshift(self, n) { // self is the string to be shifted. n denotes how many characters to shift it by
    answer = copy()
    for i = 1 to n {
        answer = self[1:] //answer = everything in self excluding the first character
        answer += self[0] // append the first character of self to answer
    }
    return answer
}

上述解决方案可行。虽然,效率很低。我们知道当一个n字符串被n移位时,移位的结果就是字符串本身。当你再多想一想时,你会发现你最终会移动n % lengthOfSelf。因此,for i = 1 to n变为for i = 1 to n%len(self)

但是,我们可以提高效率。要做到这一点,需要在适当的索引处拼接self,我会让你弄明白,因为我认为这是作业。

希望这能让你更接近!

答案 1 :(得分:0)

s1 << 0

这会调用__lshift__,而不是__ilshift__i代表就地;你无论如何都不能就地更改字符串,并且不会尝试在这里(你正试图创建一个新值)。

您的实际代码存在的问题是,您只是通过调用基础str班级来转移来实现这种转变。但基础str没有转移操作 - 这就是您完成此练习的全部原因!

提示:将两个字符串放在一起。 'foobar' << 2'obar' + 'fo'。你能看到如何切割字符串以获得这些吗?您用于切片的数字与指定用于切换的数字有何关系?