2012-05-31 95 views
1

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

>>> 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)  
+1

我猜这是作业吗? –

+0

本课缺乏作业和日常工作.......... –

回答

2

这味道就像做家庭作业,所以我不会在这里发布实际的代码。但是为了帮助,我会指出我在代码和算法中看到的缺陷:

我的python 2.7.2报告没有__ilshift__irshiftstr。另外,如果您尝试将字符串移动一定数量的字符,则不应该将您称为other的变量移位。你应该移动selfother许多字符。这就是说,你可能更好的命名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,我会让你弄清楚,因为我认为这是作业。

希望这会让你更接近!

+0

无需循环;你可以把第一个'n'字符切掉并放在最后。 –

+0

我知道,这就是为什么我提到我的帖子结束切片。但是,由于这看起来是功课,所以我不想放弃在开始时解决问题的最佳方法;相反,我想通过思考过程来参与OP。毕竟,如果这真的是家庭作业,那么它肯定是CS101左右,这意味着OP在这一点上不是一个非常有经验的程序员,因此可以从这样的指导思维过程中受益 – inspectorG4dget

+0

感谢您的帮助。一旦我使用正确的方法__rshift__和__lshift__,我就可以完成课程。 –

0
s1 << 0 

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

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

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

+0

据我所知,我需要索引和切片的字符串。如果你看我的第一篇文章,有一个使用控制台的例子,当我在控制台中>时,我得到:TypeError:<<:'sstr'和'int'不支持的操作数类型正如你在文章中所说的<< and >>运算符不是字符串类的一部分。我需要做什么才能够将它们用作参数? –

+0

您需要在您的子类中定义它们,您需要按照我的建议使用正确的名称,并且您需要编写一个定义(a)**不会尝试调用基类定义(因为它们不会“ t存在); (b)使用索引和切片。 –