Python比较两个列表中的元素

2024-09-30 04:40:37 发布

您现在位置:Python中文网/ 问答频道 /正文

我有两个清单:

一个-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。在

任何帮助都将不胜感激。在

谢谢。在

代码如下:

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

Tags: in元素列表dictionarythatismatchsentences
3条回答

现在,您已经修复了原始问题,并修复了执行反向检查的下一个问题,并重命名了所有变量,现在您得到了:

for match in dictionary:
    if any(match in value for value in sentences):
        print match

你的问题是:

The way I have the code written i can get the dictionary items but instead i want to print the sentences.

嗯,是的,你的match是一个字典项,这就是你要打印的内容,所以你得到的当然是这个。在

如果要打印包含字典项的句子,就不能使用^{},因为如果有元素为真,那么该函数的全部意义就是返回True。它不会告诉你是哪一个事实上,如果不止一个,它会在第一个停止。在

如果您不了解any之类的函数以及传递给它们的生成器表达式,那么就不应该将它们用作神奇的调用。弄清楚如何将它们写成显式循环,这样您就可以轻松地回答这些问题了。(请注意,any文档直接向您展示了如何编写等效循环。)

例如,现有代码相当于:

^{pr2}$

这样写,应该很明显如何修复它。首先,您希望打印句子而不是单词,所以打印value而不是match(同样,如果您使用有意义的变量名,如sentence和{},而不是像value这样的无意义的名称和match这样的误导性名称,这将非常有帮助。其次,要打印所有匹配的句子,而不仅仅是第一个句子,所以不要break。所以:

for match in dictionary:
    for value in sentences:
        if match in value:
            print value

如果你回到我的第一个答案,你可能会注意到这正是我建议的结构。在

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

首先,将算法转换为psuedocode,而不是像下面这样的模糊描述:

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也很简单。在

现在你已经发布了你的代码…我不知道你问的是什么问题,但至少有一点很明显有问题。在

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不要告诉你这些东西到底是什么;如果你把它们叫做sentence和{},很明显,{}永远不会是真的,word in sentence可能就是你想要的。在

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

相关问题 更多 >

    热门问题