2013-09-04 3 views
0

우선이 항목은 채팅 봇용 코드입니다. 나는 봇에게 추적 할 단어 목록을 제공하고 있으며, 그 다음에 나는 방 안에있는 모든 메시지를 나눌거야. 이제 다음과 같이 만들어야합니다.Python을 사용하는 2 목록에 있는지 확인하는 방법

하지만 모든 시도가 실패했습니다. 이것이 내 코드입니다. 그러나 내가 완전히 일을 설정하고 난 그냥 내 문제를 봤하고이 문제를 해결 바라고 세트로 내 목록 (예, 모두 나열하지 dicts이 있습니다)로 변환하는 방법을 이해하지 못하는 이론적으로 작동합니다

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) 

, 문제. 그럼에도 불구하고, 나는이 문제를 다루는 1 시간 후에 항복한다.

내가 무엇이 누락 되었습니까?

intersection(other, ...)

set & other & ...

Return a new set with elements common to the set and all others.

if s2tracker & s1tracker: 
    # do smth 

답변

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

분할 도움 :

+0

uhm ....이 3 줄의 코드를 시도했습니다 : # 1 trackeado = filter (lambda word : buffertracker, message.body.split()) # 2 trackeado가 아닌 경우 == None : # 3 print ("Test") 그러나 내 목록의 단어를 무시하고 모든 것을 저장하고있었습니다. – Saelyth

+0

잠깐, 다시 읽었습니다. 대신 IF 사실을 넣어야합니다. 그렇지 않으면? – Saelyth

+0

항상 가져 오는 중 : <0x03369DF0의 필터 개체 > – Saelyth

3

에 대한 덕분에 나는 당신이 세트 사이에 intersection가 있는지 필요가 있다고 생각 문자열은 분명히 개별 단어 목록으로 바뀌고 내장 '필터'는 인수로 람다 함수를 취하여 wheth에 대해 true 또는 false를 반환해야합니다 전달 된 항목은 결과 집합에 포함되어야합니다. 을 줄 뒤에 :

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

traceado 일치 메시지의 단어를 포함하는 목록이어야한다 -

업데이트 당신이 당신의 의견에 요구하고 내가 생각 질문에 대답하려면 당신의 단어 목록. 아, 난 그냥 당신의 buffertracker이 목록은 아니라는 것을 깨달았다, 그건 단지 -

업데이트 업데이트
if len(trackeado) > 0: 
    # Do something 

이 : 기본적으로, 당신은 단지 그 목록은 0 길이 여부가 있는지 여부 확인해야 긴 문자열은 파일에서 읽습니다. 필자의 예에서 hot_words는 찾고자하는 단어의 목록이다. 파일의 형식에 따라 파일을 목록으로 변환하려면 무언가를해야합니다.

파일이 쉼표로 구분 된 단어 목록 인 경우 다음을 수행하십시오.

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

시도해 보니 이제는 아무런 오류없이 이상한 행동을합니다. 내 목록은 다음과 같습니다 : "Bot", "bot", "saelyth", "sael", "sae", "sae", "Sael", "Sae", "elyth"] 그러나 목록을 무시하고 텍스트를 저장합니다. 누군가가 "a"라는 단어로 글을 쓸 때마다이 문장이 저장됩니다. – Saelyth

+0

@Saelyth는 단지 공백으로 단어를 분리하기 때문에 가능합니다. 문장 부호는 무엇입니까? – alecxe

+0

음, message.body.split()에서 말 하시겠습니까? 확실하지 않다. str (message.body.split())을 사용하여 그 결과를 출력하면 [ '! test', 'this', 'sentence', 'as', 'example'] 그래서 나에게 결과를 준다. 공백으로 쪼개 든 상관 없어요? – Saelyth

관련 문제