假设我在python中有一个列表a = [-1,-1,-1,1,1,1,2,2,2,-1,-1,-1,1,1,1]
我想要的是如果在python中有任何内置函数我们传递一个列表并且它将返回哪个元素存在于什么索引范围例如< / p>
>>> index_range(a)
{-1 :'0-2,9-11', 1:'3-5,12-14', 2:'6-8'}
我尝试使用Counter
库中的collection.Counter
函数,但它只输出元素的计数。
如果没有任何内置功能,请指导我如何在我自己的功能中实现这一点而不是整个代码只是一个指导方针。
答案 0 :(得分:3)
您可以使用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)]}
为了在dict 中获取字符串值,您可以修改上述函数,或者使用字典理解中函数的返回值:
>>> 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'}
答案 1 :(得分: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]}
然后,您可以将索引列表合并到范围中,如果这是您需要的。如有必要,我也可以帮助你。