2016-02-25 75 views
1

項指標如果一個人試圖找到一個項目的索引中,你可以做在這裏一對夫婦不同的方式名單最快的方法是什麼,我知道是最快的Python來查找列表

aList = [123, 'xyz', 'zara','xyz', 'abc']; 
indices = [i for i, x in enumerate(aList) if x == "xyz"] 
print(indices) 

另一種方式不符合Python和較慢的

count = 0 
indices = [] 
aList = [123, 'xyz', 'zara','xyz', 'abc']; 
for i in range(0,len(aList): 
    if 'xyz' == aList[i]: 
     indices.append(i) 
print(indices) 

第一種方法,無疑是快但是如果你想要快速地去有沒有辦法?對於第一個索引使用方法

aList = [123, 'xyz', 'zara','xyz', 'abc'];    
print "Index for xyz : ", aList.index('xyz') 

非常快,但無法處理多個索引如何才能加快速度呢?

回答

3
def find(target, myList): 
     for i in range(len(myList)): 
      if myList[i] == target: 
       yield i 

    def find_with_list(myList, target): 
     inds = [] 
     for i in range(len(myList)): 
      if myList[i] == target: 
       inds += i, 
     return inds 


In [8]: x = range(50)*200 
In [9]: %timeit [i for i,j in enumerate(x) if j == 3] 
1000 loops, best of 3: 598 us per loop 

In [10]: %timeit list(find(3,x)) 
1000 loops, best of 3: 607 us per loop 
In [11]: %timeit find(3,x) 
1000000 loops, best of 3: 375 ns per loop 

In [55]: %timeit find_with_list(x,3) 
1000 loops, best of 3: 618 us per loop 

假設你想有一個列表,你的輸出: 所有選項似乎表現出對我的列表理解是最快的(勉強)測試類似的實時性能。

如果你很酷,返回一個發電機,它比其他方法快。認爲它沒有考慮實際迭代索引,也沒有存儲它們,所以inds不能被第二次迭代。

+0

所以你說什麼迭代每個索引和做直接比較是獲得列表中匹配項的所有索引位置的最快方法? –

+0

這是我知道如何進行串行計算的最快方式。如果它是一個巨大的列表,你可以分開它並處理部分並行,那麼可能會更快 –

+1

'[i for i,j in enumerate(x)if x == 3]',second'x' should be' j'。 – gil

0
D=dict() 
for i, item in enumerate(l): 
    if item not in D: 
     D[item] = [i] 
    else: 
     D[item].append(i) 

然後只需調用D [item]來獲得匹配的索引。你會放棄最初的計算時間,但在通話時間內獲得。

1

使用list.index(elem, start)!這在C中使用for循環(請參閱CPython的listobject.c的源代碼中的實現list_index_impl函數)。 避免通過Python中的所有元素循環,它比C.

def index_finder(lst, item): 
    """A generator function, if you might not need all the indices""" 
    start = 0 
    while True: 
     try: 
      start = lst.index(item, start) 
      yield start 
      start += 1 
     except ValueError: 
      break 

import array 
def index_find_all(lst, item, results=None): 
    """If you want all the indices. 
    Pass results=[] if you explicitly need a list, 
    or anything that can .append(..)""" 
    if results is None: 
     length = len(lst) 
     results = array.array('B') if length <= 2**8 else array.array('H') if length <= 2**16 else array.array('L') if length <= 2**32 else array.array('Q') 
    start = 0 
    while True: 
     try: 
      start = lst.index(item, start) 
      results.append(start) 
      start += 1 
     except ValueError: 
      return results 

# Usage example 
l = [1, 2, 3, 4, 5, 6, 7, 8] * 32 

print(*index_finder(l, 1)) 
print(*index_find_all(l, 1)) 
0

慢獲得該項目的索引,你可以使用字典。

aList = [123, 'xyz', 'zara','xyz', 'abc']; 
#The following apporach works only on lists with unique values 
aList = list(np.unique(aList)); 
dict = enumerate(aList); 
# get inverse mapping of above dictionary, replace key with values 
inv_dict = dict(zip(dict.values(),dict.keys())) 
# to get index of item by value, use 'inv_dict' and to get value by index, use 'dict' 
valueofItemAtIndex0 = dict[0]; # value = 123 
indexofItemWithValue123 = inv_dict[123]; # index = 0