Python是forloop存储要发送给函数的值的理想方法

2024-04-25 16:42:41 发布

您现在位置:Python中文网/ 问答频道 /正文

我一直在努力创建一个脚本,其中我作为一个用户输入到一个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

代码的工作原理:

它从main开始,在main中有一个保存新线程值的old\u list(这样它就不会再次循环),在old\u names\u list中,我将逐个保存names.txt

在永远运行的while True中,我们打开文件names.txt,然后输入for new_thread in get_names():,这意味着它将在randomnames.txt的整个列表中循环,其中新的线程将以randomnames.txt的名称命名

之后,我们检查如果不是新名称\u txt==旧名称\u列表:为真。-这段代码的作用是,当我们继续创建将在filter(thread,i)中继续的线程时,它会查看names.txt中的名字是否在old\u names\u list中,如果不是的话,并查看它是否匹配。这里的要点是,在继续下一个names.txt行之前,一个名称应该通过get_names():检查所有名称

这是我最大的问题,所以我不认为我需要解释其余的。我这里的问题是,我有50个randomnames.txt名称,这意味着如果我从names.txt中搜索一个名称并通过for new_thread in get_names():进行检查,这意味着它将创建50个线程来查看是否有匹配的名称。完成first names.txt名称后,它将启动另一个名称。这意味着它将创建新的50个线程,并查看是否有任何匹配项。依此类推,直到names.txt为空

我的问题是,有没有更好的方法来保存set()或list中的所有名称,或者其他最好的方法,然后将其发送到filter(),filter()将为每个正在运行的new_thread检查all names.txt

我除了什么结果

我想要的结果是,当我第一次运行脚本时。它检查所有names.txt并将它们存储到dict或list中,然后将其发送到filter。一旦它完成了它将击中“没有改变因为没有新的补充。但如果在names.txt中添加新名称。它会使if notnew_names_list == old_names_list:成为真的,因为列表是不同的。因此,我希望它只检查names.txt上添加的新名称,以检查所有新的\u线程,并查看其是否匹配


Tags: textintxt名称newforgetif
1条回答
网友
1楼 · 发布于 2024-04-25 16:42:41

如果我理解的很好,你想检查一下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复制进来的

相关问题 更多 >