Python 如何找到列表中所有唯一元素的所有索引

Python 如何找到列表中所有唯一元素的所有索引,python,pandas,list,numpy,loops,Python,Pandas,List,Numpy,Loops,鉴于以下清单: list_ex = ['s1', 's2', 's1', 's4', 's2', 's3', 's1'] 如何找到所有不同元素的所有索引 例如,对于s1,这将是位置[0,2,6] 我想我可以通过在不同的元素list(set(list_ex))上运行一个循环,然后执行np。在哪里找到位置?下面是一个使用列表理解的简短解决方案: locations=[el[0]如果el[1]==“s1”] 解释 Enumerate创建位置/元素对列表,如下所示: [(0, 's1'), (1,

鉴于以下清单:

list_ex = ['s1', 's2', 's1', 's4', 's2', 's3', 's1']
如何找到所有不同元素的所有索引

例如,对于
s1
,这将是位置
[0,2,6]


我想我可以通过在不同的元素
list(set(list_ex))
上运行一个循环,然后执行
np。在哪里找到位置?

下面是一个使用列表理解的简短解决方案:

locations=[el[0]如果el[1]==“s1”]
解释

Enumerate创建位置/元素对列表,如下所示:

[(0, 's1'), (1, 's2'), (2, 's1'), (3, 's4'), (4, 's2'), (5, 's3'), (6, 's1')]
下面的代码得到相同的结果,它只是以for循环的形式显示:

target='s1'
地点=[]
对于枚举中的el(列表):
如果el[1]==目标:
位置。追加(el[0])

下面是一个使用列表理解的简短解决方案:

locations=[el[0]如果el[1]==“s1”]
解释

Enumerate创建位置/元素对列表,如下所示:

[(0, 's1'), (1, 's2'), (2, 's1'), (3, 's4'), (4, 's2'), (5, 's3'), (6, 's1')]
下面的代码得到相同的结果,它只是以for循环的形式显示:

target='s1'
地点=[]
对于枚举中的el(列表):
如果el[1]==目标:
位置。追加(el[0])

您可以循环遍历元素,建立一个字典,将元素映射到该元素的索引列表。使用
list
类型的
defaultdict
很方便,因为第一次读取新元素时会自动得到一个空列表

from collections import defaultdict

list_ex = ['s1', 's2', 's1', 's4', 's2', 's3', 's1']

indices = defaultdict(list)

for i, v in enumerate(list_ex):
  indices[v].append(i)

print(indices)
这将打印以下内容:

defaultdict(<class 'list'>, {'s1': [0, 2, 6], 's2': [1, 4], 's4': [3], 's3': [5]})
defaultdict(,{'s1':[0,2,6],'s2':[1,4],'s4':[3],'s3':[5]})

您可以循环遍历元素,建立一个字典,将元素映射到该元素的索引列表。使用
list
类型的
defaultdict
很方便,因为第一次读取新元素时会自动得到一个空列表

from collections import defaultdict

list_ex = ['s1', 's2', 's1', 's4', 's2', 's3', 's1']

indices = defaultdict(list)

for i, v in enumerate(list_ex):
  indices[v].append(i)

print(indices)
这将打印以下内容:

defaultdict(<class 'list'>, {'s1': [0, 2, 6], 's2': [1, 4], 's4': [3], 's3': [5]})
defaultdict(,{'s1':[0,2,6],'s2':[1,4],'s4':[3],'s3':[5]})

我发现熊猫似乎对这类问题进行了优化

import random
import pandas as pd
x = [f's{i}' for i in range(1000)]
l = [random.choice(x) for _ in range(2000000)]
output = pd.DataFrame(l).groupby([0]).indices

在最佳情况下(组的大小较大),它比枚举快3倍,在组的大小较小的情况下(每组1-2个项目)慢3倍。

我发现
pandas
似乎对这类问题进行了优化

import random
import pandas as pd
x = [f's{i}' for i in range(1000)]
l = [random.choice(x) for _ in range(2000000)]
output = pd.DataFrame(l).groupby([0]).indices
在最佳情况下(组的大小较大),它比枚举快3倍,在组的大小较小的情况下(每组1-2个项目)慢3倍