如何在python中加速迭代?

bra*_*n85 2 python iteration performance

我想知道你是否可以帮我加速我的python脚本.

我有两个清单:

a=['a','b','c','d','e','f','g','h','i','j']

b=['b','f','g','j']
Run Code Online (Sandbox Code Playgroud)

我想创建一个包含b元素的列表,但是它的长度为a,而不是b中的元素被其他东西替换,比方说'-999'.此外,我不想使用b中的元素索引替换实际元素(a,b,c ...).所以看起来像这样:

c=['-999',0,'-999','-999','-999', 1, 2,'-999','-999',3] 
Run Code Online (Sandbox Code Playgroud)

我现在的代码是:

c=[]

counter=0

for each in a:
    if each in b:
        c.append(counter)
        counter+=1
    else:
        c.append('-999')
Run Code Online (Sandbox Code Playgroud)

它工作正常,但是,在现实生活中,我的列表a长度为600 000个元素,实际上有7个b列表需要迭代它们,所有这些都在3k到250k之间.

关于如何提高速度的任何想法?

Ash*_*ary 6

如果元素b是唯一的,那么你可以试试这个:

In [76]: a=['a','b','c','d','e','f','g','h','i','j']

In [77]: b=['b','f','g','j']

In [78]: dic={x:i for i,x in enumerate(b)}

In [79]: dic
Out[79]: {'b': 0, 'f': 1, 'g': 2, 'j': 3}

In [81]: [dic.get(x,'-999') for x in a]
Out[81]: ['-999', 0, '-999', '-999', '-999', 1, 2, '-999', '-999', 3]
Run Code Online (Sandbox Code Playgroud)

对于重复的项目,您可以使用defaultdict(list):

In [102]: a=['a','b','c','d','e','f','g','b','h','i','f','j']

In [103]: b=['b','f','g','j','b','f']

In [104]: dic=defaultdict(list)

In [105]: for i,x in enumerate(b):
    dic[x].append(i)
   .....:     

#now convert every value(i.e list) present in dic to an iterator.

In [106]: dic={x:iter(y) for x,y in dic.items()}  

In [107]: [next(dic[x]) if x in dic else '-999' for x in a]  #call next() if the key 
                                                             #is present else use '-999'
Out[107]: ['-999', 0, '-999', '-999', '-999', 1, 2, 4, '-999', '-999', 5, 3]
Run Code Online (Sandbox Code Playgroud)