2016-11-03 72 views
0

我有一個類似[1,2,1,0,1,1,0,3 ..]的列表l1。我想爲每個元素找到與元素具有相同值的元素的索引。如何在列表中找到公共元素

例如,對於列表中的第一個值1,它應列出列表中存在1的所有索引,並且它應該對列表中的每個元素重複相同。我可以寫一個函數來完成遍歷列表,但想檢查是否有任何預定義的函數。

我正在從熊貓數據框中列名單,這將是很好的知道,如果系列/數據幀庫提供任何這樣的功能

+0

這將有很大的幫助,如果你表現出你寫的功能和預期輸出。如果您只想匹配其索引的元素或包含每個位置的元素索引的二維對象,則無法計算出結果。 – chthonicdaemon

回答

1

您可以使用numpy.unique,它可以返回倒數了。這可以用來使用numpy.where重建索引:

In [49]: a = [1,2,1,0,1,1,0,3,8,10,6,7] 

In [50]: uniq, inv = numpy.unique(a, return_inverse=True) 

In [51]: r = [(uniq[i], numpy.where(inv == i)[0]) for i in range(uniq.size)] 

In [52]: print(r) 
[(0, array([3, 6])), (1, array([0, 2, 4, 5])), (2, array([1])), (3, array([7])), (6, array([10])), (7, array([11])), (8, array([8])), (10, array([9]))] 
1

我試圖蠻力force..may爲u可以優化

這裏是python3代碼

L = [1,2,1,0,1,1,0,3] 
D = dict() 
for i in range(len(L)): 
    n =[] 
    if L[i] not in D.keys(): 
     for j in range(len(L)): 
      if L[i] == L[j]: 
       n.append(j) 
     D[L[i]] = n 
for j in D.keys(): 
    print(j,"->",D.get(j)) 
+0

您只需要遍歷輸入列表一次,而不是輸入列表中的每個項目。正如所寫的,這個算法的規模爲O(n^2),這並不是很好。 –

0

您也可以嘗試像這樣的:

import pandas as pd 
df = pd.DataFrame({'A': [1,2,1,0,1,1,0,3]}) 
uni = df['A'].unique() 
for i in uni: 
    lists = df[df['A'] == i].index.tolist() 
    print(i, '-->', lists) 

輸出:

1 --> [0, 2, 4, 5] 
2 --> [1] 
0 --> [3, 6] 
3 --> [7] 
0

您可以使用defaultdict來實現此目的。

from collection import defaultdict 

input = [1,2,1,0,1,1,0,3] 
#Dictionary to store our indices for each value 
index_dict = defaultdict(list) 
#Store index for each item 
for i, item in enumerate(input): 
    index_dict[item].append(i) 

如果你想包含它們是相同的輸入列表中的相應元素元素的索引列表,你可以創建到字典的引用:

same_element_indices = [index_dict[x] for x in input] 

這有僅爲每個相同元素引用一個對象的優點。

輸出將是:

[[0, 2, 4, 5], 
[1], 
[0, 2, 4, 5], 
[3, 6], 
[0, 2, 4, 5], 
[0, 2, 4, 5], 
[3, 6], 
[7]] 
相關問題