Python比较两个列表中的元素

时间:2013-12-18 20:38:19

标签: python list dictionary

我有两个清单:

a - dictionary,其中包含["impeccable", "obvious", "fantastic", "evident"]等关键字作为列表

的元素

b - sentences,其中包含["I am impeccable", "you are fantastic", "that is obvious", "that is evident"]

等句子

目标是使用dictionary列表作为参考。

流程如下:

  1. 获取sentences列表的元素,并针对dictionary列表中的每个元素运行它。如果存在任何元素,则将该句子吐出到新列表
  2. sentences列表中的每个元素重复步骤1。
  3. 非常感谢任何帮助。

    感谢。

    以下是代码:

    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
    

3 个答案:

答案 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,它会给你一些至少是真实的东西,甚至可能是你真正想要的东西,但我不确定。

作为旁注,如果您为变量使用了更好的名称,那么这将更加明显。 partialvalue并没有告诉你这些事实是什么;如果你打电话给他们sentenceword,很明显sentence in word永远不会成真,而word in sentence可能就是你想要的。

此外,查看中间值以调试此类内容确实很有帮助。当您使用明确的for语句时,您可以print(partial)查看partial所持有的每个内容,或者您​​可以在调试器中放置断点,或者您可以在可视化器中单步执行this one。如果你必须将any(genexpr)分解成一个显式循环,那么就这样做。 (如果您不知道如何,那么您可能无法理解生成器表达式或any函数的作用,并且只是复制并粘贴了您不理解的随机代码,并尝试更改随机内容直到它起作用......在这种情况下,你应该停止这样做,并了解它们实际意味着什么。)