为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

慕运维8079593 2023-09-12 16:42:25
给出以下列表:list_ex = ['s1', 's2', 's1', 's4', 's2', 's3', 's1']如何找到所有不同元素的所有索引?例如,对于s1,这将是locations [0, 2, 6]。我认为我可以通过在不同的元素上运行循环来做到这一点list(set(list_ex)),然后执行 anp.where来查找位置?
查看完整描述

3 回答

?
慕婉清6462132

TA贡献1804条经验 获得超2个赞

我发现这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

它可以比enumerate最佳场景(组的大小较大)快 3 倍,而在组的大小较小(每组 1 - 2 个项目)的情况下慢 3 倍。


查看完整回答
反对 回复 2023-09-12
?
四季花海

TA贡献1811条经验 获得超5个赞

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


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


查看完整回答
反对 回复 2023-09-12
?
慕哥6287543

TA贡献1831条经验 获得超10个赞

这是使用列表理解的简短解决方案:


locations = [el[0] for el in enumerate(list_ex) if el[1] == "s1"]

解释


枚举创建位置/元素对的列表,它看起来像这样:


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


查看完整回答
反对 回复 2023-09-12
  • 3 回答
  • 0 关注
  • 85 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信