python中for循环的矢量化

2024-09-30 06:15:07 发布

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

我是python的新手,有一个关于代码矢量化的问题要问

def makeNames2(nList):
  for nLi in nList:
    nLIdx=[i for i,j in enumerate(nList) if j==nLi]
    if nLIdx.__len__()>1:
        for i,j in enumerate(nLIdx):
            if i>0: nList[j]=nList[j]+str(i)
  return nList

执行以下操作:

^{pr2}$

代码运行得很好,但是我想知道是否有一种方法可以将for循环矢量化?在

编辑

谢谢大家的三个答案。这正是我感兴趣的,我想选择所有的答案。我不能多选一个,但所有的都有效。在


Tags: 答案代码inforlenifdef矢量化
3条回答
nLTest, items = ['asda','asda','test','ada','test','yuil','test'], {}
for idx, item in enumerate(nLTest):
    nLTest[idx] += str(items.setdefault(item, 0) or "")
    items[item] += 1
print nLTest

输出

^{pr2}$

你可以简化一下:

def makenames(lst):
    seen = {}
    for index, name in enumerate(lst):
        if name in seen:
            seen[name] += 1
            lst[index] = "{0}{1}".format(name, seen[name])
        else:
            seen[name] = 0
    return lst

这将删除在O(n)中操作的for循环之一(字典访问是O(1))。在

注意,这会修改列表;您可能希望使用一个新的output列表改为append。您还可以使用defaultdictCounter模块中的defaultdict稍微简化这一点。在

这可能更具可读性,避免了O(n^2)。也不到位。在

from collections import defaultdict
def makeNames3(nList):
    counter= defaultdict(lambda:0)
    def posfix(x):
        n= counter[x]
        counter[x]+=1
        return str(n) if n>0 else ""
    return [x+posfix(x) for x in nList]

相关问题 更多 >

    热门问题