获取列表中重复元素的索引范围

3
假设我有一个列表a = [-1,-1,-1,1,1,1,2,2,2,-1,-1,-1,1,1,1],我想知道是否有任何内置函数可以传递一个列表,并返回哪些元素存在于哪个索引范围内,例如:
>>> index_range(a)
{-1 :'0-2,9-11', 1:'3-5,12-14', 2:'6-8'}

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

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

2个回答

3

您可以使用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)]}

为了在字典中获取字符串值,您可以修改上述函数,或使用函数的返回值在字典解析中如下使用:
>>> 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'}

0
你可以使用一个以列表项为键,以它们的索引为值的 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]}

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接