2

私のpythonスクリプトを高速化するのを手伝ってもらえないかと思っていました。

私は2つのリストを持っています:

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

b=['b','f','g','j']

b の要素を含むリストを作成したいが、長さは a であり、b にない要素は別のものに置き換えられます'-999'。また、実際の要素 (a、b、c...) の代わりに、b の要素のインデックスに置き換えたいと考えています。したがって、次のようになります。

c=['-999',0,'-999','-999','-999', 1, 2,'-999','-999',3] 

今のところ私のコードは次のとおりです。

c=[]

counter=0

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

それは正常に動作しますが、実際には私のリスト a は 600,000 要素の長さであり、実際にはそれらを反復する必要がある 7 つの b リストがあり、すべて 3k から 250k 要素の間にあります。

これをスピードアップする方法についてのアイデアはありますか?

4

2 に答える 2

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]

繰り返されるアイテムの場合、次を使用できます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]
于 2013-01-18T12:36:24.393 に答える
0

もっと簡単なもの:

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

b=['b','f','g','j']

for i,x in enumerate(a):
    a[i] = b.index(x) if x in b else -999

出力:

[-999, 0, -999, -999, -999, 1, 2, -999, -999, 3]

分析:

OPの方法:

>>> 
len(a) = 10000
len(b) = 5000
Time = 0:00:01.063000

方法 1:

c=[]
for i,x in enumerate(a):
    c.append(b.index(x) if x in b else -999)

>>> 
len(a) = 10000
len(b) = 5000
Time = 0:00:01.109000

Ashwini Chaudhary メソッド:

>>> 
len(a) = 10000
len(b) = 5000
Time = 0:00:00
于 2013-01-18T12:39:29.027 に答える