我有两个清单:
a - dictionary
,其中包含["impeccable", "obvious", "fantastic", "evident"]
等关键字作为列表
b - sentences
,其中包含["I am impeccable", "you are fantastic", "that is obvious", "that is evident"]
目标是使用dictionary
列表作为参考。
流程如下:
sentences
列表的元素,并针对dictionary
列表中的每个元素运行它。如果存在任何元素,则将该句子吐出到新列表sentences
列表中的每个元素重复步骤1。非常感谢任何帮助。
感谢。
以下是代码:
sentences = "The book was awesome and envious","splendid job done by those guys", "that was an amazing sale"
dictionary = "awesome","amazing", "fantastic","envious"
##Find Matches
for match in dictionary:
if any(match in value for value in sentences):
print match
答案 0 :(得分:1)
现在您已修复了原始问题,并修复了向后检查的下一个问题,并重命名了所有变量,您有:
for match in dictionary:
if any(match in value for value in sentences):
print match
你的问题是:
我编写代码的方式我可以获得字典项,但我想打印句子。
嗯,是的,你的match
是一个字典项目,这就是你要打印的东西,所以当然这就是你得到的。
如果要打印包含字典项的句子,则不能使用any
,因为如果任何元素为真,那么函数的整个点只返回True。它不会告诉你哪些 - 实际上,如果有多个,它将在第一个停止。
如果您不理解any
之类的函数以及您传递给它们的生成器表达式,那么您真的不应该将它们用作魔术调用。弄清楚如何将它们编写为显式循环,您将能够轻松地自己回答这些问题。 (请注意,any
文档直接显示如何编写等效循环。)
例如,您现有的代码相当于:
for match in dictionary:
for value in sentences:
if match in value:
print match
break
这样写,应该很明显如何解决它。首先,您要打印句子而不是单词,因此请打印value
而不是match
(同样,如果您使用有意义的变量名称,例如sentence
和{{ 1}}而不是像word
那样无意义的名称和像value
这样的误导性名称......)。其次,你想要打印所有匹配的句子,而不仅仅是第一个,所以不要match
。所以:
break
如果你回到我的第一个答案,你可能会注意到这与我建议的完全相同。
你可以通过使用理解和迭代器函数来简化或缩短它,但直到你理解了简单版本,以及这些理解和迭代器函数是如何工作的。
答案 1 :(得分:0)
首先将您的算法转换为伪代码而不是模糊的描述,如下所示:
for each sentence:
for each element in the dictionary:
if the element is in the sentence:
spit out the sentence to a new list
这些步骤中唯一一个转换为Python并非完全无足轻重的步骤是“将句子吐出到新列表”。要做到这一点,您需要在开始之前拥有新列表,例如a_new_list = []
,然后您可以在其上调用append
。
一旦你将它转换为Python,你会发现“我无可挑剔,太棒了”会两次吐出来。如果你不想那样,你需要找到合适的请打破内循环并继续下一句话。转换为Python也很简单。
答案 2 :(得分:0)
现在你已经发布了你的代码......我不知道你问的问题是什么,但至少有一件事显然是错的。
sentences
是一个句子列表。
因此,for partial in sentences
表示每个partial
都是一个句子,例如"I am impeccable"
。
dictionary
是一个单词列表。因此,for value in dictionary
表示每个value
都是一个单词,例如"impeccable"
。
现在,您正在检查partial in value
每个部分的每个值。那将永远不会成真。 "I am impeccable"
不在"impeccable"
。
如果你转过来,检查一下value in partial
,它会给你一些至少是真实的东西,甚至可能是你真正想要的东西,但我不确定。
作为旁注,如果您为变量使用了更好的名称,那么这将更加明显。 partial
和value
并没有告诉你这些事实是什么;如果你打电话给他们sentence
和word
,很明显sentence in word
永远不会成真,而word in sentence
可能就是你想要的。
此外,查看中间值以调试此类内容确实很有帮助。当您使用明确的for
语句时,您可以print(partial)
查看partial
所持有的每个内容,或者您可以在调试器中放置断点,或者您可以在可视化器中单步执行this one。如果你必须将any(genexpr)
分解成一个显式循环,那么就这样做。 (如果您不知道如何,那么您可能无法理解生成器表达式或any
函数的作用,并且只是复制并粘贴了您不理解的随机代码,并尝试更改随机内容直到它起作用......在这种情况下,你应该停止这样做,并了解它们实际意味着什么。)