Python比较两个列表中的元素

Python比较两个列表中的元素,python,list,dictionary,Python,List,Dictionary,我有两份清单: 一个包含[无可挑剔,显而易见,奇妙,显而易见]等关键词作为列表元素的字典 b-包含以下句子的句子,如[我是无可挑剔的,你是了不起的,那是显而易见的,那是显而易见的] 目标是使用字典列表作为参考 程序如下: 为句子列表选取一个元素,并针对字典列表中的每个元素运行它。如果有任何元素存在,则将该句子吐出到新列表中 对句子列表中的每个元素重复步骤1。 任何帮助都将不胜感激 谢谢 代码如下: sentences = "The book was awesome and envious","s

我有两份清单:

一个包含[无可挑剔,显而易见,奇妙,显而易见]等关键词作为列表元素的字典

b-包含以下句子的句子,如[我是无可挑剔的,你是了不起的,那是显而易见的,那是显而易见的]

目标是使用字典列表作为参考

程序如下:

为句子列表选取一个元素,并针对字典列表中的每个元素运行它。如果有任何元素存在,则将该句子吐出到新列表中 对句子列表中的每个元素重复步骤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

首先,将算法转换为伪代码,而不是模糊的描述,如下所示:

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并不十分简单的步骤是将句子吐出到一个新列表中。要做到这一点,您需要在开始之前有一个新的列表,比如一个新的列表=[],然后您可以在它上面调用append


一旦你把它转换成Python,你会发现我是无可挑剔的,而且非常棒,被吐了两次。如果你不想这样,你需要找到合适的“请”来打破内部循环,继续下一句话。转换成Python也很简单。

既然你已经发布了你的代码……我不知道你问的是什么问题,但至少有一点是明显的错误

句子是句子的列表

所以,句子中的部分意味着每个部分都是一个句子,就像我是无瑕的一样

字典是一个单词列表。所以,因为字典中的值意味着每个值都是一个单词,就像无懈可击一样

现在,您正在为每个分部的每个值检查分部值。这永远不会是真的。我是无懈可击的不是在无懈可击

如果你把它转过来,检查是否有部分价值,它会给你一些至少有时是正确的东西,甚至可能是你真正想要的,但我不确定

作为一个补充说明,如果您为变量使用更好的名称,这将更加明显。部分和价值不能告诉你这些东西到底是什么;若你们把它们称为句子和单词,那个么很明显,单词中的句子永远不会是真的,句子中的单词可能就是你们想要的


另外,查看中间值来调试类似的事情也很有帮助。当您使用显式for语句时,您可以printportial来查看partial包含的每个内容,或者您可以在调试器中放置断点,或者您可以在类似的可视化工具中单步执行。如果必须将anygenexpr分解为一个显式循环,那么就这样做。如果您不知道如何操作,那么您可能不了解生成器表达式或any函数的作用,刚刚复制并粘贴了您不理解的随机代码,并尝试更改随机内容,直到它起作用……在这种情况下,您应该停止这样做,了解它们的实际含义。

现在您已经修复了原始问题,修复了下一个向后检查的问题,并重命名了所有变量,你有这个:

for match in dictionary:
    if any(match in value for value in sentences):
        print match
你的问题是:

按照我编写代码的方式,我可以获得字典项,但我想打印句子

嗯,是的,你的匹配项是一个字典项,这就是你正在打印的内容,当然这就是你得到的

如果您想打印包含字典项的句子,您不能使用,因为该函数的整个要点是,如果任何元素为True,则只返回True。它不会告诉你哪一个事实上,如果有多个,它会在第一个停止

如果您不理解任何函数以及传递给它们的生成器表达式,那么您真的不应该将它们用作神奇的调用。找出如何将它们编写为显式循环,您将能够轻松地回答这些问题。注意,any文档直接向您展示了如何编写等效循环

例如,您现有的代码相当于:

for match in dictionary:
    for value in sentences:
        if match in value:
            print match
            break
这样写的话,如何修复它应该是显而易见的。首先,你想打印句子而不是单词,所以打印值而不是匹配。再次,如果你使用有意义的变量名,如句子和单词,而不是无意义的名称,如值和误导性名称,如匹配,这将非常有帮助…。其次,你要打印所有匹配的句子,而不仅仅是第一个,所以不要打断。因此:

如果你回到我的第一个答案,你可能会注意到这和我建议的结构完全一样


您可以通过使用理解和迭代器函数来简化或缩短此过程,但必须先了解简单版本,以及这些理解和迭代器函数是如何工作的。

您是否有任何示例代码来了解您迄今为止所做的工作/进展如何
试试这个怎么样好了,现在您已经给了我们所有的代码:有什么问题吗?它做错什么了吗?如果是,哪一步做了错误的事情,你希望它做什么,它做什么?或者你有没有什么方法可以扩展它而你被卡住了?如果是,什么?或者你是在担心效率、简洁性、可读性还是其中的一部分?嗨。我不确定step3输出是否正确,因为要检查句子列表中的哪些元素与字典中的元素有一些共同的值。如有任何建议,将不胜感激。谢谢你在句子中使用partial:if anypartial-in-value-for-value-in-dictionary:print'element-present'else:print'缺席'我做了以下几件事:但我不确定它是否对句子中的partial起作用:if anypartial-in-value-for-value-in-dictionary:print'缺席'@user3116753:不要尝试发帖注释中的代码。在一个问题中发布你的代码,并解释什么不起作用,哪个部分做了错误的事情,包括你期望它做什么,它做了什么,或者你在哪里卡住了。然后人们会回答这个问题。很抱歉。我对这个完全陌生。谢谢。@user3116753:没问题。只需创建一个新问题,最好是两个问题之间有链接,以便人们知道它们是相关的,否则,有人可能会认为你不知道它们是相关的,然后将新问题作为dup关闭…,如果你做得对,你应该很快得到解决方案。您好Abarnert,很抱歉,我在发送之前编辑了代码。要简化事情,请参见上文。我的目标只是在字典中输出具有匹配值的句子。按照我编写代码的方式,我可以获得字典项,但我想打印句子。感谢you@user3116753:不断地将问题重新编辑为不同的后续问题,并删除原始问题的所有痕迹不是一件好事。这意味着在对照问题阅读时,答案和评论不再有意义,也意味着任何人在搜索类似于你原来问题的东西时都无法找到解决方案。当你有一个新问题太大而无法作为后续评论回答时,创建一个新问题。同时,如果其中一个答案解决了您原来的问题,请接受该答案;如果你自己解决了,写下并接受你自己的。没问题。谢谢你的帮助。一些成员帮助解决了这个问题。是的,你是对的。这是我最后的死刑。谢谢你的帮助。知道如何消除最终输出的重复数据吗?我使用了排序和设置功能,但运气不好。感谢you@user3116753:如果将打印值替换为my_set.addvalue,然后在此循环后在my_set上循环,则不会有任何重复。因此,假设您正在做一些不同的、错误的事情,在不知道您在做什么的情况下进行调试是不可能的。这又是一个新问题,不是这个问题的后续问题。
for match in dictionary:
    for value in sentences:
        if match in value:
            print value