为什么我的代码没有正确创建元组列表?

时间:2013-05-20 16:17:10

标签: python methods tuples

direction = ['north', 'south', 'east', 'west', 'down', 'up', 'left', 'right', 'back']
class Lexicon(object):

    def scan(self, sentence):
        self.sentence = sentence
        self.words    = self.sentence.split()
        self.term = []

        for word in self.words:
            if word in direction:
                part = ('direction','%s' % word)
                self.term.append(word)
            return self.term


lexicon = Lexicon()

当我传入lexicon.scan('north south east')时,我期待返回给我[('direction','north'),('direction','south'),('direction','east')]。相反,我得到['north']。这就是我希望程序在整体上做的事情。

  1. 判刑。
  2. 对该句子使用扫描并将句子分成不同的单词。
  3. 扫描检查句子中的所有单词与多个列表(这只是单个列表上的第一个测试)。
  4. 如果在列表中找到一个单词,那么我想创建一个元组,第一个术语是列表的名称,第二个术语是单词。
  5. 我想为不在列表中的单词创建一个元组,就像之前的单词一样,但是使用“Error”而不是列表名称。
  6. 我想返回一个名为term的元组列表,其中包含所有不同的单词,其列表名称或错误位于元组的第一部分

3 个答案:

答案 0 :(得分:5)

此:

self.term.append(word)

应该是这样的:

self.term.append(part)

您放弃part而不是将其添加到self.term

此外,你是return从循环内而不是在循环之后 - 你需要将你的return陈述放一个档次。这是工作代码:

for word in self.words:
    if word in direction:
        part = ('direction','%s' % word)
        self.term.append(part)
return self.term

输出:

[('direction', 'north'), ('direction', 'south'), ('direction', 'east')]

答案 1 :(得分:4)

这里的这一行缩进太远了:

return self.term

它是for循环体的一部分,因此你的循环过早地返回。将其缩小到一个缩进级别。

您还可以使用列表理解:

self.term = [('direction', word) for word in self.words if word in direction]

答案 2 :(得分:0)

我会补充其他答案,这不是获得两组交集的最佳方法。为什么不简单地使用Python sets

    class Lexicon(object):

        def bar(self, sentence):
            return set(sentence.split()) & set(direction)   

我觉得这个更清晰,更有效率。