【问题标题】: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 找到位置?

【问题讨论】:

    标签: python pandas list numpy loops


    【解决方案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'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 倍。

      【讨论】:

        【解决方案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])
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2020-04-28
          • 2016-11-02
          • 2023-03-15
          • 2021-10-25
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多