2016-11-03 43 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]] 
相关问题