矢量化python中的for循环

时间:2014-02-19 14:25:17

标签: 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

执行以下操作:

>>> nLTest=['asda','asda','test','ada','test','yuil','test']
>>> print(makenames2(nLTest)
['asda', 'asda1', 'test', 'ada', 'test1', 'yuil', 'test2']

代码工作正常,但我想知道是否有办法对for循环进行矢量化?

修改

感谢大家的所有三个答案。这正是我感兴趣的,并且希望选择所有答案。我不能选择多个,但所有这些都有效。

3 个答案:

答案 0 :(得分: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

<强>输出

['asda', 'asda1', 'test', 'ada', 'test1', 'yuil', 'test2']

答案 1 :(得分:1)

你可以稍微简化一下:

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循环,在O(n)中运行(字典访问为O(1))。

请注意,这会就地修改列表;您可能希望将output列表添加到append。您还可以使用defaultdict模块中的Countercollections稍微简化一下。

答案 2 :(得分:1)

这可以说更具可读性,避免使用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]