Python 如何在列表中查找公共元素

Python 如何在列表中查找公共元素,python,pandas,dataframe,Python,Pandas,Dataframe,我有一个列表l1,看起来像[1,2,1,0,1,1,0,3..]。我想为每个元素找到与元素具有相同值的元素的索引 例如,对于列表中的第一个值1,它应该列出列表中存在1的所有索引,并且应该对列表中的每个元素重复相同的操作。我可以编写一个函数来迭代列表,但我想检查是否有任何预定义的函数 我从Pandas dataframe列中获取列表,最好知道series/dataframe库是否提供了任何您可以使用的函数,这些函数也可以返回相反的值。这可用于使用以下方法重建索引: 您可以使用,它也可以返回相反的值

我有一个列表l1,看起来像[1,2,1,0,1,1,0,3..]。我想为每个元素找到与元素具有相同值的元素的索引

例如,对于列表中的第一个值1,它应该列出列表中存在1的所有索引,并且应该对列表中的每个元素重复相同的操作。我可以编写一个函数来迭代列表,但我想检查是否有任何预定义的函数

我从Pandas dataframe列中获取列表,最好知道series/dataframe库是否提供了任何您可以使用的函数,这些函数也可以返回相反的值。这可用于使用以下方法重建索引:

您可以使用,它也可以返回相反的值。这可用于使用以下方法重建索引:


我试过暴力…也许你能优化

下面是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))  

我试过暴力…也许你能优化

下面是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))  

您也可以尝试以下方法:

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]

您也可以尝试以下方法:

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]

您可以使用
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]]

您可以使用
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]]

如果您展示您编写的函数和预期的输出,这将非常有帮助。我很难弄清楚你想要的是与索引匹配的元素,还是一个包含每个位置元素索引的二维对象。如果你展示你编写的函数和预期的输出,这会有很大帮助。我很难确定您想要的是与索引匹配的元素,还是包含每个位置元素索引的二维对象。您应该只需要在输入列表上迭代一次,而不是对输入列表中的每个项目迭代一次。如前所述,该算法的规模为O(n^2),这并不太好。您应该只需要在输入列表上迭代一次,而不是对输入列表中的每个项目迭代一次。如前所述,该算法的规模为O(n^2),这并不伟大。