我有一个类似于[1,2,1,0,1,1,0,3 ..]的列表l1。我想为每个元素找到与元素具有相同值的元素的索引。
例如,对于列表中的第一个值1,它应列出列表中存在1的所有索引,并且它应对列表中的每个元素重复相同。我可以编写一个函数来迭代列表但是想检查是否有任何预定义的函数。
我从Pandas数据帧列中获取列表,很清楚系列/数据帧库是否提供任何此类函数
答案 0 :(得分: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 :(得分:1)
我试过暴力......可能你可以优化
这里是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))
答案 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]
答案 3 :(得分: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]]