代码之家  ›  专栏  ›  技术社区  ›  Saelyth

如何使用python检查2个列表中是否有内容

  •  0
  • Saelyth  · 技术社区  · 11 年前

    首先,我得说这是聊天机器人的代码。我给机器人一个要跟踪的单词列表,然后我在房间里拆分所有消息。现在我需要做一些类似的东西:

    IF any word from my list is IN message.body THEN do something. 
    

    但所有尝试都失败了,这是我的代码。

      leyendotracker = open("listas\eltracker.txt", "r") #Open file with tracker words
      buffertracker = leyendotracker.read() #Read words and save them in a variable
      leyendotracker.close() #Close file
      s1tracker = set(message.body.split()) #Set the messages in chat as a Set
      s2tracker = set(buffertracker) #Set the variable with words from file as a Set
      if s2tracker in s1tracker: #Check if any word from the file is in the message from chat.
        print("[TRACKER - "+user.name+" said: "+message.body)
    

    这在理论上应该有效,但我并不完全理解Sets是如何工作的,我只是在谷歌上搜索了我的问题,并将我的列表(是的,两者都是列表,而不是dicts)转换为Sets,希望这能解决问题。尽管如此,在处理这个问题一个小时后,我还是投降了。

    我错过了什么? 感谢您的帮助:)

    2 回复  |  直到 11 年前
        1
  •  3
  •   alecxe    11 年前

    我想你需要看看是否有 intersection 两组之间:

    交叉点(其他,…)

    设置&其他&。。。

    返回一个新集合,其中包含该集合和所有其他集合的公共元素。

    if s2tracker & s1tracker:
        # do smth
    
        2
  •  1
  •   David Downes    11 年前

    使用内置的过滤功能:

    >>> hot_words = ["spam", "eggs"]
    >>> message_body = "Oh boy, my favourite! spam, spam, spam, eggs and spam"
    >>> matching_words = filter(lambda word: word in hot_words, message_body.split())
    >>> matching_words
    ['eggs', 'spam']
    >>> message_body = "No, I'd rather just egg and bacon"
    >>> matching_words = filter(lambda word: word in hot_words, message_body.split())
    >>> matching_words
    []
    

    拆分字符串显然会将其变成一个单独单词的列表,内置的“filter”将lambda函数作为参数,该参数应返回true或false,以确定传递给它的项是否应包含在结果集中。

    使现代化 -回答我的问题 认为 您在评论中问道: 行之后:

    trackeado = filter(lambda word: word in buffertracker, message.body.split())
    

    traceado应该是一个包含消息中与单词列表匹配的单词的列表。本质上,您只需要检查该列表的长度是否为0:

    if len(trackeado) > 0:
        # Do something
    

    更新更新 -啊,我刚刚意识到你的buffertracker不是一个列表,它只是从文件中读取的一个长字符串。在我的示例中,hot_words是您正在查找的单个单词的列表。根据文件的格式,您需要对其进行一些操作,将其转换为列表。

    例如,如果您的文件是逗号分隔的单词列表,请执行以下操作:

    >>> words = buffer tracker.split(',')
    >>> trackeado = filter(lambda word: word in words, message.body.split())
    >>> if len(trackeado) > 0:
    ...     print "found"