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

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

Я создал этот код:

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

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

Как работает код:

Он начинается с основного, где есть old_list , в котором сохраняется значение new_thread(чтобы он не зацикливался снова) и old_names_list , где я собираюсь сохранить names.txt по одному.

В то время как True работает вечно, Мы открываем файлnames.txt и затем мы вводим for new_thread in get_names():, что означает, что он будет проходить по всему списку randomnames.txt , где new_thread будет именем по имени randomnames.txt .

После этого мы проверяем , если не new_names_txt == old_names_list: равно True.- Этот код выполняет то, что он выглядит, если имя в names.txt находится внутри old_names_list , если нет, мы продолжаем создавать поток, который будет продолжаться в filter(thread,i), ипосмотреть, если это соответствует.Дело в том, что одно имя к тому времени должно проверять все имена через get_names():, прежде чем продолжить следующую строку names.txt.

А вот моя основная проблема, поэтому я не думаю, что мне нужнообъясни остальное.Моя проблема здесь в том, что у меня есть etc 50 randomnames.txt names, что означает, что если я ищу одно имя из names.txt и проверяю for new_thread in get_names():, это означает, что он создаст 50 потоков, чтобы увидеть, есть ли совпадения.Как только первое имя names.txt выполнено, запускается другое.Это означает, что он создаст новые 50 потоков и посмотрит, есть ли совпадения.и так до тех пор, пока names.txt не станет пустым.

Мой вопрос здесь - есть ли лучший способ для примера сохранить, может быть, все имена в set () или списке или что-то лучшее, а затем отправить его наfilter (), который будет проверять все names.txt для каждого new_thread, который работает?

Какие результаты я должен исключать?

Результат, который я хочу получить, заключается в том, что при запускескрипт первый раз.Он проверяет все names.txt и сохраняет их в dict или list, а затем отправляет их на фильтрацию.Как только это будет сделано, оно попадет в «Без изменений!так как ничего нового не добавлено.Но если вы добавите новое имя в names.txt.Это сделает, если не new_names_list == old_names_list:, чтобы быть правдой, так как список не то же самое.Поэтому я хочу, чтобы он проверял только новое имя, добавленное в names.txt, чтобы проверить все new_threads и посмотреть, соответствует ли оно.

1 Ответ

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

Если я правильно понял, вы хотите проверить, есть ли какое-либо из имен в names.txt в randomnames.txt, как насчет этого?

NAME_LIST_FILE_PATH = r'C:\Temp\randomnames.txt'
NAME_INPUT_FILE_PATH = r'C:\Temp\names.txt'

with open(NAME_LIST_FILE_PATH, 'r') as name_list_file:
    name_list = [name for name in name_list_file]

with open(NAME_INPUT_FILE_PATH, 'r') as name_input_file:
    name_input_list = [name for name in name_input_file]

matched_names = []
unmatched_names = []

for name in name_input_list:
    if name in name_list:
        matched_names.append(name)
    else:
        unmatched_names.append(name)

print('Matched names:\n{matched}\nUnmatched names:\n{unmatched}'.format(
    matched=''.join(matched_names),
    unmatched=''.join(unmatched_names)
    ))

вывод:

λ python "C:\Temp\so_test.py"
Matched names:
Alejandro
Tisha
Eleni

Unmatched names:
Dia
Hobert

редактировать: не нужно так много новых строк, они копируются с начального for name in name_*_file

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...