优化Dict和Lis中的单词检查

2024-06-28 11:19:18 发布

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

我有以下代码

for key,value in jobs.items():
    job = key
    jobVector[key] = []
    for x in range (0, len(listOfWords)):
        if listOfWords[x] in jobs[job]:
            jobVector[key].append(1)
        else:
             jobVector[key].append(0)

我有一个dict,JOBS存储了不同的单词,每个单词都有一个计数。在本例中,计数是不相关的,但假设乔布斯对其中一个键是这样的:

jobs[1] = account, addit, allow, ascertain, associ, avail, career, cellular, chang, coasttocoast, commiss, compani, competit, comput, countri, coupl, credit, custom, demand, develop, driven, dynam, employ, enjoi, ethic, exist, expand, experienc, fastest, flexibl, greet, growth, highperform, independ, individu, internet, knowledg, maintain, market, monitor, opportun, order, outstand, payment, person, phone, place, price, privatelyown, process, product, profession, provid, purchas, pursu, receiv, recommend, repres, resolv, respons, retail, right, selfmotiv, specif, store, support, technolog, territori, thatll, throughout, total, train, uniqu, unpreced, wireless, account, addit, aptitud, avail, bartend, benefit, bestbui, bilingu, cellular, colleg, commiss, commun, comput, consult, cross, custom, dedic, deduct, dental, direct, disabl, discount, effect, enterpris, entir, entrepreneuri, excel, execut, extend, famili, fleet, flexibl, goalori, health, impress, individu, insid, insur, integr, interperson, keyword, liter, longterm, medic, member, negoti, offer, outsid, packag, period, person, pleas, possess, possibl, pound, prefer, prescript, proud, provid, recogn, rentacar, repres, respons, retail, retir, salesman, salesperson, saleswoman, satisfi, shield, shortterm, spanish, spend, spirit, sprint, stand, technic, therefor, tmobil, vehicl, verbal, visit, websit, wireless, wwwjoincellularsalescom

让我们假设listOfWords是这样的:

listOfWords = associ, avail, career, cellular, chang, coasttocoast, commiss, compani, competit, comput, countri, coupl, credit, custom, demand, develop, driven, dynam, employ, enjoi, ethic

我非常想浏览一下listOfWords中的每个单词,看看它是否存在于JOBS dict中每个job的单个job中。如果存在,则存储1,否则将0存储到另一个字典中

他们有没有办法加快速度?它目前可以工作,但在15000个工作数据集上大约需要3分钟


Tags: keyinforcustomjobsjob单词dict
1条回答
网友
1楼 · 发布于 2024-06-28 11:19:18

首先,用作业集替换所有这些作业列表可以加快速度。然后,您向我们展示的代码将完全不需要更改,它将神奇地变得更快,因为对集合的in测试几乎是即时的,而对列表的in测试必须检查列表中的每个值


通过用直接循环替换range循环,使用value而不是重新查找,并将整个循环转化为理解,您还可以获得一些小的加速和较大的可读性增益:

for key, value in jobs.items():
    jobVector[key] = [1 if word in value else 0 for word in listOfWords]

甚至:

jobVector = {
    key: [1 if word in value else 0 for word in listOfWords]
    for key, value in jobs.items() }

另外,如果这是针对python2.x的,请使用viewitems(如果不需要2.6或更早版本)或iteritems(如果需要)而不是items


但实际上,除了使用列表代替集合之外,我怀疑您的数据结构还有一个更大的问题。如果不知道你想用这些东西做什么,很难确定,但我怀疑你可以用另一本字典,把每个工作都键入,让事情变得更清楚更快,这样你就可以立即查找,而不是穷尽地搜索

如果每个作业只能属于一个作业(顺便说一句,这里的术语非常混乱……),那么这只是一个将每个作业映射到其父作业的dict:

d = {ijob: job for job, ijobs in jobs.items() for ijob in ijobs}

如果每个作业可以属于多个作业,则需要将每个作业映射到其所属的作业集:

d = collections.defaultdict(set)
for job, ijobs in jobs.items():
    for ijob in jobs:
        d[ijob].add(job)

这样看来,您甚至不需要对任何东西使用jobVector,因为快速查找它的元素和使用您预先计算的值一样快

相关问题 更多 >