我是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循环矢量化?
编辑
谢谢大家给我这三个答案。这正是我所感兴趣的,并希望选择所有的答案。我只能选择一个以上的,但它们都能工作。
发布于 2014-02-19 14:33:17
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']发布于 2014-02-19 14:32:57
您可以简化一下:
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或来自collections模块的Counter稍微简化这一点。
发布于 2014-02-19 14:43:19
这可以说是更具可读性,避免了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]https://stackoverflow.com/questions/21883354
复制相似问题