pythonのリスト内の重複要素検索


python(2.7.10)で，list内の検索をする際

> In[1]: a = [1,2,3,3,3,4,5]  
>  In[2]: a.index(3)  
>  Out[2]: 2

と最初のインデックスが返ってきます．  
理想は[2,3,4]と全ての該当インデックスが欲しいのですが，簡単な書き方で取得できる方法はありませんか．

今のところ可能な限り要素を検索しつつ取得した場所を取り除き続けるという力技をしていますがもう少し簡潔でメモリに優しい方法はないでしょうか  
(元のリストはそのままにしておきたいのでdeepcopyをしていますがメモリを食ってしまうようで大きいリストで大量に実行すると止まってしまいます…)

[code]

    from copy import deepcopy
    b = deepcopy(a)
    ans = []
    while True:
      try:   
        ans.append(b.index(3))
        b.pop(b.index(3))
      except:
        break
    
[/code]




単純にforで

[code]

    ans = []
    for index, value in enumerate(a):
        if value == 3:
            ans.append(index)
    
[/code]

* * *

内包表記で

[code]

    ans = [ i for i, v in enumerate(a) if v == 3]
    
[/code]




単純にforで

[code]

    ans = []
    for index, value in enumerate(a):
        if value == 3:
            ans.append(index)
    
[/code]

* * *

内包表記で

[code]

    ans = [ i for i, v in enumerate(a) if v == 3]
    
[/code]

