如何获取python列表中不同整数组的最大索引
例如:如何获取python列表中不同整数组的最大索引,python,Python,例如: [0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0] 在这种情况下,我需要: 第一个'0'组=索引:0-4,长度:5 第一个'1'组=索引:5-6,长度:2 第二个'0'组=索引:7,长度:1 2nd'1'group=index:8-17,length:10我想您正在寻找itertools.groupby。有了它,您可以通过原始数据集中的每个整数分组获得列表列表 >>> data =
[0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0]
在这种情况下,我需要:
'0'
组=索引:0-4,长度:5'1'
组=索引:5-6,长度:2'0'
组=索引:7,长度:1'1'
group=index:8-17,length:10我想您正在寻找itertools.groupby
。有了它,您可以通过原始数据集中的每个整数分组获得列表列表
>>> data = [0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0]
>>> [list(group) for _, group in itertools.groupby(data)]
[[0, 0, 0, 0, 0], [1, 1], [0], [1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [0, 0, 0,0, 0]]
或者,要获取索引,也可以使用itertools.groupby和.islice
和操作符.itemgetter
>>> [sorted(set(itemgetter(0, -1)([i[0] for i in g))) for _, g in groupby(enumerate(data), key=itemgetter(1))]
[[0, 4], [5, 6], [7], [8, 17], [18, 22]]
或者,要获取开始或结束索引,请使用以下命令:(注意min
和max
确定开始或结束索引)
要获得最大组使用的起始索引:
>>> max(([next(group)[0], sum(1 for _ in group)] for _, group in groupby(enumerate(data), key=itemgetter(1))), key=itemgetter(1))[0]
8
我想您正在寻找
itertools.groupby
。有了它,您可以通过原始数据集中的每个整数分组获得列表列表
>>> data = [0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0]
>>> [list(group) for _, group in itertools.groupby(data)]
[[0, 0, 0, 0, 0], [1, 1], [0], [1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [0, 0, 0,0, 0]]
或者,要获取索引,也可以使用itertools.groupby和.islice
和操作符.itemgetter
>>> [sorted(set(itemgetter(0, -1)([i[0] for i in g))) for _, g in groupby(enumerate(data), key=itemgetter(1))]
[[0, 4], [5, 6], [7], [8, 17], [18, 22]]
或者,要获取开始或结束索引,请使用以下命令:(注意min
和max
确定开始或结束索引)
要获得最大组使用的起始索引:
>>> max(([next(group)[0], sum(1 for _ in group)] for _, group in groupby(enumerate(data), key=itemgetter(1))), key=itemgetter(1))[0]
8
标准库为此提供了
itertools.groupby
。使用起来有点棘手,因为它需要做很多工作:
>>> from itertools import groupby
>>> data = [0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0]
>>> groupby(data)
<itertools.groupby object at 0x0000015AB6EB3C78>
现在我们可以看到发生了什么:grouper对象从列表中生成块
所以我们需要做的就是检查这些列表的len
,并获得最大值。我们修正理解,以便忽略值
,获得每个石斑鱼
的len
,并将结果输入内置的max
,而不是制作列表:
>>> max(len(list(grouper)) for value, grouper in groupby(data))
10
标准库为此提供了
itertools.groupby
。使用起来有点棘手,因为它需要做很多工作:
>>> from itertools import groupby
>>> data = [0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0]
>>> groupby(data)
<itertools.groupby object at 0x0000015AB6EB3C78>
现在我们可以看到发生了什么:grouper对象从列表中生成块
所以我们需要做的就是检查这些列表的len
,并获得最大值。我们修正理解,以便忽略值
,获得每个石斑鱼
的len
,并将结果输入内置的max
,而不是制作列表:
>>> max(len(list(grouper)) for value, grouper in groupby(data))
10
不使用itertools,您可以用另一种方式完成:
j=0
for i,val in enumerate(data):
if i == 0:
out=[[val]]
if val == data[i-1]:
out[j] += [val]
else:
j+=1
out += [[val]]
输出:
[[0, 0, 0, 0, 0, 0], [1, 1], [0], [1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [0, 0, 0, 0, 0]]
{0: [6, 1, 5], 1: [2, 10]}
10
10 8 17
现在,使用唯一值和每个值的子列表长度制作一个dict:
counts = {}
for o in out:
if o[0] not in counts.keys():
counts[o[0]] = [len(o)]
else:
counts[o[0]] += [len(o)]
输出:
[[0, 0, 0, 0, 0, 0], [1, 1], [0], [1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [0, 0, 0, 0, 0]]
{0: [6, 1, 5], 1: [2, 10]}
10
10 8 17
现在,使用您所追求的值获取序列的最大长度,在您的情况下,它是1:
max(counts[1])
输出:
[[0, 0, 0, 0, 0, 0], [1, 1], [0], [1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [0, 0, 0, 0, 0]]
{0: [6, 1, 5], 1: [2, 10]}
10
10 8 17
编辑:要获取此特定序列的索引,您可以执行以下操作:
id0 = 0
for o in out:
if o[0] != 1 or len(o) != max(counts[1]):
id0 += len(o)
if o[0] == 1 and len(o) == max(counts[1]):
id0 -= 1
break
id1 = id0 + max(counts[1]) - 1
print(max(counts[1]), id0, id1)
输出:
[[0, 0, 0, 0, 0, 0], [1, 1], [0], [1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [0, 0, 0, 0, 0]]
{0: [6, 1, 5], 1: [2, 10]}
10
10 8 17
它不是最漂亮的……但它很有效:)不用itertools,你可以用另一种方式:
j=0
for i,val in enumerate(data):
if i == 0:
out=[[val]]
if val == data[i-1]:
out[j] += [val]
else:
j+=1
out += [[val]]
输出:
[[0, 0, 0, 0, 0, 0], [1, 1], [0], [1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [0, 0, 0, 0, 0]]
{0: [6, 1, 5], 1: [2, 10]}
10
10 8 17
现在,使用唯一值和每个值的子列表长度制作一个dict:
counts = {}
for o in out:
if o[0] not in counts.keys():
counts[o[0]] = [len(o)]
else:
counts[o[0]] += [len(o)]
输出:
[[0, 0, 0, 0, 0, 0], [1, 1], [0], [1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [0, 0, 0, 0, 0]]
{0: [6, 1, 5], 1: [2, 10]}
10
10 8 17
现在,使用您所追求的值获取序列的最大长度,在您的情况下,它是1:
max(counts[1])
输出:
[[0, 0, 0, 0, 0, 0], [1, 1], [0], [1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [0, 0, 0, 0, 0]]
{0: [6, 1, 5], 1: [2, 10]}
10
10 8 17
编辑:要获取此特定序列的索引,您可以执行以下操作:
id0 = 0
for o in out:
if o[0] != 1 or len(o) != max(counts[1]):
id0 += len(o)
if o[0] == 1 and len(o) == max(counts[1]):
id0 -= 1
break
id1 = id0 + max(counts[1]) - 1
print(max(counts[1]), id0, id1)
输出:
[[0, 0, 0, 0, 0, 0], [1, 1], [0], [1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [0, 0, 0, 0, 0]]
{0: [6, 1, 5], 1: [2, 10]}
10
10 8 17
它不是最漂亮的…但它可以工作:)您可以使用以下函数进行迭代:
def count_through_a_list(x):
"""
returns all distinct continuous groups of values in a list
output is in the form of records
"""
# Initialize these values
group_start = 0
group_count = 1
prev = x[0]
groups = []
for i,n in enumerate(x):
# if n is not the same as the previous value OR i is the last index
if n!=prev or i == len(x)-1:
groups.append({'start':group_start, 'end':i-1, 'value':prev, 'length':i-group_start, 'group_counter':group_count})
# Reset the appropriate values
group_count+=1
group_start = i
prev = n
return groups
groups = count_through_a_list(x)
pd.DataFrame(groups, columns=['start','end','value', 'length', 'group_counter'])
start end value length group_counter
0 0 4 0 5 1
1 5 6 1 2 2
2 7 7 0 1 3
3 8 17 1 10 4
4 18 21 0 4 5
可以使用以下函数进行迭代:
def count_through_a_list(x):
"""
returns all distinct continuous groups of values in a list
output is in the form of records
"""
# Initialize these values
group_start = 0
group_count = 1
prev = x[0]
groups = []
for i,n in enumerate(x):
# if n is not the same as the previous value OR i is the last index
if n!=prev or i == len(x)-1:
groups.append({'start':group_start, 'end':i-1, 'value':prev, 'length':i-group_start, 'group_counter':group_count})
# Reset the appropriate values
group_count+=1
group_start = i
prev = n
return groups
groups = count_through_a_list(x)
pd.DataFrame(groups, columns=['start','end','value', 'length', 'group_counter'])
start end value length group_counter
0 0 4 0 5 1
1 5 6 1 2 2
2 7 7 0 1 3
3 8 17 1 10 4
4 18 21 0 4 5
到目前为止你试过什么?一般来说,在StackOverflow上,您应该发布您当前拥有的代码以及出现的问题。这里的长度是多少?第4组的长度是10,但你说它应该是最大值1。@Jab我认为“最大值1”应该是指“连续1个值序列的最大长度”。@Jab和Karl:是的,我是指序列“1”的最大长度。到目前为止,你试过什么?一般来说,在StackOverflow上,您应该发布您当前拥有的代码以及出现的问题。这里的长度是多少?第4组的长度是10,但你说它应该是最大值1。@Jab我认为“最大值1”应该是指“连续1个值序列的最大长度”。@Jab和Karl:是的,我是指序列的最大长度'1',谢谢@Karl!所以我得到了序列的最大长度值(0和1)。但我也需要索引。在这种情况下是8-17。在这种情况下,您可能需要手动执行。想一想你将如何用纸和铅笔来解决它,一次看一个元素。在这个过程中,你需要记住什么信息?嗯,(a)每当我遇到1时,我可以迭代列表(b),我开始计数和开始索引(c)当不再有1时,记录结束索引(d)重复并检查计数值是否增加(e)对应计数的开始和结束的最大值给了我索引。但这当然是没有效率的!工作很辛苦,但效率很好。每个元素只需要看一次,对吗?很明显,你做不到比这更好的了。itertools解决方案也必须以更隐蔽的方式查看每个元素。谢谢@Karl!所以我得到了序列的最大长度值(0和1)。但我也需要索引。在这种情况下是8-17。在这种情况下,您可能需要手动执行。想一想你将如何用纸和铅笔来解决它,一次看一个元素。在这个过程中,你需要记住什么信息?嗯,(a)每当我遇到1时,我可以迭代列表(b),我开始计数和开始索引(c)当不再有1时,记录结束索引(d)重复并检查计数值是否增加(e)对应计数的开始和结束的最大值给了我索引。但这当然是没有效率的!工作很辛苦,但效率很好。每个元素只需要看一次,对吗?很明显,你做不到比这更好的了。itertools解决方案也必须以更隐蔽的方式查看每个元素