实现“<<”的标准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)
答案 0 :(得分:2)
这有点像家庭作业,所以我不打算在这里发布实际的代码。但是为了提供帮助,我将指出我在您的代码和算法中看到的缺陷:
我的python 2.7.2在__ilshift
中报告没有__irshift
或str
。此外,如果您尝试将字符串移动一定数量的字符,那么您不应该移动您调用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'
。你能看到如何切割字符串以获得这些吗?您用于切片的数字与指定用于切换的数字有何关系?