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

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

假设我有一个列表 a = [-1,-1,-1,1,1,1,2,2,2,-1,-1,-1,1,1,1] 在 python 中,我想要的是如果 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 - 获取列表中重复元素的索引范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49915793/

相关文章:

python - 为什么我收到 "RuntimeError: This event loop is already running"

python - 在 Python 中绘制分段函数

Python仅列出包含特定子文件夹的文件夹

python - Flask SQLAlchemy 按值或另一个过滤

python - 使用 PYMC3/Theano 广播数学运算

python - 如何基于函数式api命名keras模型

矩形网格上的 Python 4D 线性插值

python - 如何修复 "' pandas.compat' has no attribute 'string_types' “python3 中的错误

python - Pandas 从 dataframe.loc 获取索引列表

python - 将 Python 类变量设置为等于类函数的输出