如何查找列表中所有唯一元素的所有索引[重复]
Posted
技术标签:
【中文标题】如何查找列表中所有唯一元素的所有索引[重复]【英文标题】:How to find all of the indices for all unique elements in a list [duplicate] 【发布时间】:2021-01-12 06:40:43 【问题描述】:给定以下列表:
list_ex = ['s1', 's2', 's1', 's4', 's2', 's3', 's1']
如何找到所有不同元素的所有索引?
例如,对于s1
,这将是位置[0, 2, 6]
。
我认为我可以通过在不同元素 list(set(list_ex))
上运行循环来做到这一点,然后通过 np.where
找到位置?
【问题讨论】:
【参考方案1】:您可以遍历元素,构建一个字典,将元素映射到该元素的索引列表。使用 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])
【讨论】:
【参考方案2】:我发现pandas
似乎针对此类问题进行了优化。
import random
import pandas as pd
x = [f'si' for i in range(1000)]
l = [random.choice(x) for _ in range(2000000)]
output = pd.DataFrame(l).groupby([0]).indices
在最佳情况下(组的大小很大)它可以比 enumerate
快 3 倍,在组大小较小的情况下(每组 1 到 2 个项目)慢 3 倍。
【讨论】:
【参考方案3】:这是一个使用列表理解的简短解决方案:
locations = [el[0] for el in enumerate(list_ex) if el[1] == "s1"]
说明
Enumerate 创建一个位置/元素对列表,如下所示:
[(0, 's1'), (1, 's2'), (2, 's1'), (3, 's4'), (4, 's2'), (5, 's3'), (6, 's1')]
下面这段代码得到了同样的结果,它只是以 for 循环的形式显示它:
target = 's1'
locations = []
for el in enumerate(list_ex):
if el[1] == target:
locations.append(el[0])
【讨论】:
以上是关于如何查找列表中所有唯一元素的所有索引[重复]的主要内容,如果未能解决你的问题,请参考以下文章