这两段代码有什么区别?第一个返回一个令牌列表,但第二个代码似乎只返回一个包含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]
这两个不一样吗?
答案 0 :(得分:2)
两个代码段都不同。
在第一个中,您正在调用sentence.get_query_tokens(aspect)
并打印获得的方面标记的第一个实例。
在第二个中,您使用列表构建器构造来构建方面标记数组并打印出第一组标记。
答案 1 :(得分:1)
每个sentence
每个aspect
打印一次您的第一个样本,因此您将获得总计len(aspects) * len(sentences)
次打印(假设为aspects
和sentences
列表)。您的第二个样本只有一个print
,因此它只会打印一个元素。
您希望每个样本执行后aspect_tokens
是否相同?因为他们不会。第一个示例在每次迭代中重新分配aspect_tokens
,因此在循环执行后,aspect_tokens
将等于最后计算的值,具体为sentences[-1].get_query_tokens(aspects[-1])
。
我正在破译你所追求的内容:
aspect_tokens = []
for aspect in aspects:
for sentence in sentences:
all_aspect_tokens.append(sentence.get_query_tokens(aspect)[0])
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)
他们不等同
第一个迭代aspects
和sentences
,并在每一步创建一个令牌列表。然后它打印列表中的第一个标记。但是每一步都会这样做一次
第二个创建一个列表,它将get__query_tokens
生成的每个列表放入其中。然后它在最后打印一组令牌
我通常是列表推导的忠实粉丝,但我认为在这种情况下它们不应该被使用,因为它使代码更难阅读。