【问题标题】:Get index range of the repetitive elements in the list获取列表中重复元素的索引范围
【发布时间】:2018-04-19 08:02:45
【问题描述】:

假设我在 python 中有一个列表a = [-1,-1,-1,1,1,1,2,2,2,-1,-1,-1,1,1,1],我想要的是如果 python 中有任何内置函数,我们在其中传递一个列表,它将返回哪个元素存在于什么索引范围内,例如

>>> index_range(a)
{-1 :'0-2,9-11', 1:'3-5,12-14', 2:'6-8'}

我尝试使用 collection.Counter 库中的 Counter 函数,但它只输出元素的计数。

如果没有任何内置函数,请指导我如何在我自己的函数中实现这一点,而不是整个代码只是一个指南。

【问题讨论】:

    标签: python python-3.x python-2.7 list


    【解决方案1】:

    您可以使用itertools.groupbycollections.defaultdict 创建自定义函数,以列表形式获取数字范围:

    from itertools import groupby
    from collections import defaultdict
    
    
    def index_range(my_list):
        my_dict = defaultdict(list)
        for i, j in groupby(enumerate(my_list), key=lambda x: x[1]):
            index_range, numlist = list(zip(*j))
            my_dict[numlist[0]].append((index_range[0], index_range[-1]))
        return my_dict
    

    示例运行:

    >>> index_range([-1,-1,-1,1,1,1,2,2,2,-1,-1,-1,1,1,1])
    {1: [(3, 5), (12, 14)], 2: [(6, 8)], -1: [(0, 2), (9, 11)]}
    

    为了在你的dict中获取字符串,你可以修改上面的函数,或者在dictionary comprehension中使用函数的返回值:

    >>> result_dict = index_range([-1,-1,-1,1,1,1,2,2,2,-1,-1,-1,1,1,1])
    
    >>> {k: ','.join('{}:{}'.format(*i) for i in v)for k, v in result_dict.items()}
    {1: '3:5,12:14', 2: '6:8', -1: '0:2,9:11'}
    

    【讨论】:

      【解决方案2】:

      您可以使用dict,它将列表项用作键并将它们的索引用作值:

      >>> lst = [-1,-1,-1,1,1,1,2,2,2,-1,-1,-1,1,1,1]
      >>> indexes = {}
      >>> for index, item in enumerate(lst):
      ...    indexes.setdefault(value, []).append(index)
      >>> indexes
      {1: [3, 4, 5, 12, 13, 14], 2: [6, 7, 8], -1: [0, 1, 2, 9, 10, 11]}
      

      然后,如果您需要,您可以将索引列表合并到范围中。如有必要,我也可以帮助您。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-03-10
        • 1970-01-01
        • 2022-08-17
        • 1970-01-01
        • 2013-12-03
        • 2018-09-05
        • 2013-05-26
        • 1970-01-01
        相关资源
        最近更新 更多