添加带空格的字符串到堆栈

时间:2011-12-11 17:49:06

标签: python

我正在开发Python中的迷你语言(不是真的,只是个人项目的一些命令)。

以下是代码:

class FlashCard:
    def __init__(self):
        self.commands = {'addQuestion':self.addQuestion}
        self.stack = []
        self.questions = {}


    def addQuestion(self):
        question = self.stack.pop()
        answer = input(question)


    def interpret(self,expression):
        for token in expression.split():
            if token in self.commands:
                operator = self.commands[token]
                operator()
            else:
                self.stack.append(token)

i = FlashCard()
i.interpret('testing this addQuestion')

解释函数只会从字符串中拉出最后一个字(this)。有没有办法让它拉出整条线?

谢谢!

2 个答案:

答案 0 :(得分:2)

由于stack是一个列表,并且您正在调用不带参数的pop方法,因此您将获得列表中的最后一个元素。您可能希望在空格分隔的字符串中转换列表,而不是:

def addQuestion(self):
    question = ' '.join(self.stack)
    answer = input(question)

观察popjoin的副作用是不同的。 pop将修改原始列表:

>>> stack = ['testing', 'this']
>>> stack.pop()
'this'
>>> stack
['testing']

虽然join不会:

>>> stack = ['testing', 'this']
>>> ' '.join(stack)
'testing this'
>>> stack
['testing', 'this']

编辑(参见下面OP的注释):要解析同一输入中的多个行/命令,您可以执行不同的操作。我想到的最容易的事情是:在调用operator()之后刷新堆栈:

if token in self.commands:
    operator = self.commands[token]
    operator()
    self.stack = []

编辑2(请参阅下面我自己的评论):以下是使用字符串列表的完整示例:

class FlashCard:
    def __init__(self):
        self.commands = {'addQuestion':self.addQuestion}

    def addQuestion(self, phrase):
        answer = raw_input(phrase)

    def interpret(self, expressions):
        for expression in expressions.split('\n'):
            phrase, command = expression.rsplit(' ', 1)
            if command in self.commands:
                operator = self.commands[command]
                operator(phrase)
            else:
                raise RuntimeError('Invalid command')

expressions = '''testing this addQuestion
testing that addQuestion
testing error removeQuestion'''
i = FlashCard()
i.interpret(expressions)

HTH!

答案 1 :(得分:1)

您可以更改addQuestion以使用整个堆栈。

def addQuestion(self):
    question = ' '.join(self.stack) + '?'
    self.stack = []
    answer = raw_input(question)

我在input收到错误,因此我将其更改为raw_input。我想这就是你想要的。