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之间.
关于如何提高速度的任何想法?
如果元素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)
| 归档时间: |
|
| 查看次数: |
968 次 |
| 最近记录: |