这两段Python代码有什么区别?

时间:2016-11-18 16:20:22

标签: python python-2.7

这两段代码有什么区别?第一个返回一个令牌列表,但第二个代码似乎只返回一个包含1个项目的列表。

变量

sentences = load_parsed_example_sentences() # list of sentences
# sentences are a list of BasicTokens
# BasicTokens are single words
aspects = ["plot"]

代码示例1:

for aspect in aspects:
    for sentence in sentences:
        aspect_tokens = sentence.get_query_tokens(aspect)
        print aspect_tokens[0]

代码示例2:

aspect_tokens = [aspect_token for aspect in aspects for sentence in sentences for aspect_token in sentence.get_query_tokens(aspect)]
print aspect_tokens[0]

这两个不一样吗?

4 个答案:

答案 0 :(得分:2)

两个代码段都不同。

在第一个中,您正在调用sentence.get_query_tokens(aspect)并打印获得的方面标记的第一个实例。

在第二个中,您使用列表构建器构造来构建方面标记数组并打印出第一组标记。

答案 1 :(得分:1)

每个sentence每个aspect打印一次您的第一个样本,因此您将获得总计len(aspects) * len(sentences)次打印(假设为aspectssentences列表)。您的第二个样本只有一个print,因此它只会打印一个元素。

您希望每个样本执行后aspect_tokens是否相同?因为他们不会。第一个示例在每次迭代中重新分配aspect_tokens,因此在循环执行后,aspect_tokens将等于最后计算的值,具体为sentences[-1].get_query_tokens(aspects[-1])

我正在破译你所追求的内容:

代码示例1

aspect_tokens = []
for aspect in aspects:
    for sentence in sentences:
        all_aspect_tokens.append(sentence.get_query_tokens(aspect)[0])

代码示例2

aspect_tokens = [sentence.get_query_tokens(aspect)[0] for sentence in sentences for aspect in aspects]

这两个样本将生成相同的aspect_tokens列表。

答案 2 :(得分:0)

aspect_tokens = [sentence.get_query_tokens(aspect)[0] for aspect in aspects for sentence in sentences]
print aspect_tokens

答案 3 :(得分:0)

他们不等同 第一个迭代aspectssentences,并在每一步创建一个令牌列表。然后它打印列表中的第一个标记。但是每一步都会这样做一次 第二个创建一个列表,它将get__query_tokens生成的每个列表放入其中。然后它在最后打印一组令牌 我通常是列表推导的忠实粉丝,但我认为在这种情况下它们不应该被使用,因为它使代码更难阅读。

相关问题