首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >获取列表中重复元素的索引范围

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

Stack Overflow用户
提问于 2018-04-19 08:02:45
回答 2查看 151关注 0票数 3

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

代码语言:javascript
运行
复制
>>> index_range(a)
{-1 :'0-2,9-11', 1:'3-5,12-14', 2:'6-8'}

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

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-04-19 08:23:13

您可以使用itertools.groupbycollections.defaultdict创建自定义函数,以获得列表形式的数字范围,如下所示:

代码语言:javascript
运行
复制
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

样本运行:

代码语言:javascript
运行
复制
>>> 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中以字符串的形式获得值,您可以修改上面的函数,或者在字典理解中使用函数的返回值如下:

代码语言:javascript
运行
复制
>>> 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'}
票数 3
EN

Stack Overflow用户

发布于 2018-04-19 08:11:54

您可以使用一个dict,它将列表项用作键,将其索引用作值:

代码语言:javascript
运行
复制
>>> 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]}

如果需要的话,可以将索引列表合并到范围中。必要的话我也可以帮你。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49915793

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档