Сохраните значения в списке и отправьте в функцию - PullRequest
0 голосов
/ 14 декабря 2018

Поэтому я пытаюсь создать сценарий, в котором я перебираю текстовый файл, в котором я хочу сохранить все значения из txt-файла и затем отправить его в функцию.Я объясню это после кода ниже:

randomnames.txt

Alejandro  
Tisha  
Eleni  
Milton  
Jeanice  
Billye  
Vicki  
Shelba  
Valorie  
Penelope  
Mellissa  
Ambrose  
Retta  
Milissa  
Charline  
Brittny  
Ehtel  
Hilton  
Hobert  
Lakendra  
Silva  
Lawana  
Sidney  
Janeen  
Audrea  
Orpha  
Peggy  
Kay  
Marvis  
Tia  
Randy  
Cary  
Santana  
Roma  
Mandi  
Tyrone  
Felix  
Maybelle  
Leonia  
Micha  
Idalia  
Aleida  
Elfrieda  
Velia  
Cassondra  
Drucilla  
Oren  
Kristina  
Madison  
Dia  


names.txt

Alejandro
Tisha
Eleni
Dia
Hobert

import json, time, sys, os, timeit, random, colorama, requests, traceback, multiprocessing, re
from random import choice
import threading


def get_names():

    name_test = [line.rstrip('\n') for line in open('randomnames.txt')]
    return name_test

def filter(thread, i):

    text = thread

    positive_keywords = [i]

    has_good = False

    for ch in ['&', '#', '“', '”', '"', '*', '`', '*', '’', '-']:
        if ch in text:
            text = text.replace(ch, "")

    sentences = [text]

    def check_all(sentence, ws):
        return all(re.search(r'\b{}\b'.format(w), sentence) for w in ws)

    for sentence in sentences:
        if any(check_all(sentence, word.split('+')) for word in positive_keywords):
            has_good = True
            break

    if not has_good or i == "":
        sys.exit()

    print('Matched ' + text)

def main():
    old_list = []

    old_names_list = []

    while True:

        new_names_list = [line.rstrip('\n') for line in open('names.txt')]
        for new_thread in get_names():

            if not new_names_list == old_names_list:
                for i in new_names_list:
                    if not i in old_names_list:
                        threading.Thread(target=filter, args=(new_thread, i)).start()
                        if new_thread not in old_list:
                            old_list.append(new_thread)

            elif new_thread not in old_list:
                threading.Thread(target=filter, args=(new_thread, new_names_list)).start()
                old_list.append(new_thread)

        else:
            randomtime = random.randint(1, 3)
            print('No changes!')
            time.sleep(randomtime)

        old_names_list = new_names_list
if __name__ == '__main__':
    try:
        main()

    except KeyboardInterrupt:
        print('Keyboard - Interrupted' )
        sys.exit()

На данный момент программа работает так, что она проверяет все имена в randomnames.txt и проверяет, совпадает ли какое-либо из этих имен с именами вnames.txt.Если есть совпадение, оно распечатывает совпадение, если нет, то оно просто делает sys.exit (который убивает поток).

Однако моя проблема заключается в части

if not new_names_list == old_names_list:
                    for i in new_names_list:
                        if not i in old_names_list:
                            threading.Thread(target=filter, args=(new_thread, i)).start()
                            if new_thread not in old_list:
                                old_list.append(new_thread)

                elif new_thread not in old_list:
                    threading.Thread(target=filter, args=(new_thread, new_names_list)).start()
                    old_list.append(new_thread)

Там, где я считаю, проблема в том, что он запускает много потоков, потому что он берет одно имя из names.txt и проверяет все имена одно за другим (поток) имен в randomnames.txt.Это означает, что если в файле randomnames.txt имеется 50 имен, то будет создано 50 потоков, где он проверяет, совпадает ли какое-либо из имен из randomnames.txt с именем из names.txt.Если он совпадает, то он распечатает, что есть совпадение.Проблема в том, что нужно создать 50 потоков только с одним именем, и это означает, что для добавления нового имени будет добавлено еще 50 потоков.

Причина, по которой я считаю, что это проблема, и как ее можно решить, заключается в том, что если возможнодобавив все имена из names.txt в список, а затем отправьте его в filter (), где он проверяет, совпадает ли любое из имен в names.txt с именами из randomnames.txt

1 Ответ

0 голосов
/ 14 декабря 2018

Код в исходном сообщении чрезвычайно сложен.По сути, вы сравниваете две коллекции имен для матчей.Это теория множеств, и вы должны использовать для этого наборы Python, а не списки.Рассмотрим:

names = {'Bob', 'Cindy', 'Dave'}
other_names = {'Lou', 'Pete', 'Cindy'}
print(names & other_names)  # {‘Cindy’}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...