0

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

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,希望能解决问题。尽管如此,我在处理这个问题 1 小时后投降了。

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

4

2 回答 2

3

我认为您需要查看集合之间是否存在交集

交叉口(其他,...)

设置 & 其他 & ...

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

if s2tracker & s1tracker:
    # do smth
于 2013-09-04T11:29:46.620 回答
1

使用内置过滤器功能:

>>> 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
[]

拆分字符串显然会将其转换为单个单词的列表,并且内置的“过滤器”将 lambda 函数作为参数,该参数应该返回 true 或 false 来判断传递给它的项目是否应该包含在结果集中.

更新- 回答我认为您在评论中提出的问题:行后:

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

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

if len(trackeado) > 0:
    # Do something

更新更新- 啊,我刚刚意识到您的缓冲区跟踪器不是一个列表,它只是从文件中读取的一个长字符串。在我的示例中,hot_words 是您要查找的单个单词的列表。根据文件的格式,您需要对其进行处理,将其转换为列表。

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

>>> words = buffer tracker.split(',')
>>> trackeado = filter(lambda word: word in words, message.body.split())
>>> if len(trackeado) > 0:
...     print "found"
于 2013-09-04T11:48:26.433 回答