在python中对for循环进行矢量化

在python中对for循环进行矢量化,python,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 nLis

我是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
以下哪项功能:

>>> nLTest=['asda','asda','test','ada','test','yuil','test']
>>> print(makenames2(nLTest)
['asda', 'asda1', 'test', 'ada', 'test1', 'yuil', 'test2']
代码运行良好,但我想知道是否有一种方法可以将for循环矢量化

编辑


谢谢大家的三个答案。这正是我感兴趣并希望选择所有答案的原因。我不能选择多个,但它们都可以工作

您可以将其简化一点:

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
这将删除其中一个for循环,在字典访问为O1时在中操作

请注意,这会修改现有列表;您可能希望添加一个新的输出列表。您还可以使用collections模块中的defaultdict或Counter稍微简化此过程

输出


在^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]

你能解释一下你所说的矢量化是什么意思吗?如果你是指SSE3中的矢量化,那么它可能会重复——而不是用python开箱即用。对于某些问题,您可能可以使用第三方软件包来解决,但即使这样,也很难说什么时候实际将内容矢量化,而不是在实现中推入另一种语言,例如C。根据问题和python实现的不同,您可以使用多处理或有时使用线程将其并行化,如果是nLIdx,也可以将_ulen_uu;>1写为lennLIdx>1,或者nLIdx@NoelEvans如果lennLIdx>1大于1,这意味着至少有2个元素不等同于if nLIdx。您只需执行以下操作即可defaultdictint@thefourtheye你说得对,我不知道int有一个默认值。我不确定这是显式的还是隐式的,尽管我认为你可以进一步避免if和nLTest[idx]+=stritems.setdefaultitem,0或@goncalopp awome:谢谢你,伙计。更新了我的答案。
['asda', 'asda1', 'test', 'ada', 'test1', 'yuil', 'test2']
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]