首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >向矢量化python中的for循环

向矢量化python中的for循环
EN

Stack Overflow用户
提问于 2014-02-19 14:25:16
回答 3查看 842关注 0票数 3

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

代码语言:javascript
复制
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

这方面的工作如下:

代码语言:javascript
复制
>>> nLTest=['asda','asda','test','ada','test','yuil','test']
>>> print(makenames2(nLTest)
['asda', 'asda1', 'test', 'ada', 'test1', 'yuil', 'test2']

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

编辑

谢谢大家给我这三个答案。这正是我所感兴趣的,并希望选择所有的答案。我只能选择一个以上的,但它们都能工作。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-02-19 14:33:17

代码语言:javascript
复制
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

输出

代码语言:javascript
复制
['asda', 'asda1', 'test', 'ada', 'test1', 'yuil', 'test2']
票数 3
EN

Stack Overflow用户

发布于 2014-02-19 14:32:57

您可以简化一下:

代码语言:javascript
复制
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稍微简化这一点。

票数 1
EN

Stack Overflow用户

发布于 2014-02-19 14:43:19

这可以说是更具可读性,避免了O(n^2)。也不合适。

代码语言:javascript
复制
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]
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21883354

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档