1

实现“<<”和“>>”方法作为字符串中字符的循环移位的标准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)    
4

2 回答 2

2

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

我的 python 2.7.2 报告 no__ilshift__irshiftin str。此外,如果您尝试将字符串移动一定数量的字符,那么您不应该移动您调用的变量other。你应该改变self许多other字符。话虽这么说,你可能最好命名othern或类似。

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

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

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在适当的索引处进行拼接,我会让你弄清楚,因为我认为这是家庭作业。

希望这能让你更接近!

于 2012-05-31T01:49:11.957 回答
0
s1 << 0

这叫__lshift__,不是__ilshift__i代表就地;无论如何,您都无法就地更改字符串,也没有尝试在这里(您正在尝试创建新值)。

您的实际代码的问题是您试图通过调用基str类的班次来实现班次。但是基str没有这种移位操作——这就是你进行这个练习的全部原因!

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

于 2012-05-31T03:27:44.413 回答