+-

假设我在 python中有一个列表a = [-1,-1,-1,1,1,1,2,2,2,-1,-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函数,但是它仅输出元素的计数.
如果没有任何内置函数,您可以指导我如何在自己的函数中实现此目标,而不仅仅是整个代码.
最佳答案
您可以使用
itertools.groupby和
collections.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'}
点击查看更多相关文章
转载注明原文:python-获取列表中重复元素的索引范围 - 乐贴网