如何查找列表中所有唯一元素的所有索引[重复]

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])

【讨论】:

以上是关于如何查找列表中所有唯一元素的所有索引[重复]的主要内容,如果未能解决你的问题,请参考以下文章

在PHP中查找数组元素的所有可能的唯一组合[重复]

列表python中每个唯一元素的所有索引

怎么查找python列表中元素的位置

查找列表中元素的索引[重复]

在 Python 中,从列表中删除重复项以使所有元素都是唯一的*同时保留顺序*的最快算法是啥? [复制]

如何在python列表中查找某个元素的索引