我是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
循环进行矢量化?
修改 的
感谢大家的所有三个答案。这正是我感兴趣的,并且希望选择所有答案。我不能选择多个,但所有这些都有效。
答案 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
模块中的Counter
或collections
稍微简化一下。
答案 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]