示例:
[0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0]在这种情况下,我需要:
1
'1' '0'组=索引: 0-4,长度:5'1'组=指数5-6,长度:2E 117'0'>组=索引: 8-17,长度:10<代码>E 218<-需要这个<代码>D19sH 220<代码>H 121第3组>d22组=索引: 18 - 22,长度:5<代码>H 223<代码G 224>发布于 2019-10-23 00:56:53
您可以使用以下函数进行迭代:
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发布于 2019-10-23 00:24:16
我想你是在找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 and .islice和operator.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确定开始或结束索引)
>>> [min(i[0] for i in group) for _, group in groupby(data)]
[0, 5, 7, 8, 18]
>>> [max(i[0] for i in group) for _, group in groupby(data)]
[4, 6, 7, 17, 22]并获得最大组的起始指数:
>>> max(([next(group)[0], sum(1 for _ in group)] for _, group in groupby(enumerate(data), key=itemgetter(1))), key=itemgetter(1))[0]
8发布于 2019-10-23 00:34:46
标准库为此目的提供了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>嗯。这似乎还不太有用。但是我们查看文档并看到它是一个生成器,所以让我们尝试将它扩展为一个列表:
>>> list(groupby(data))
[(0, <itertools._grouper object at 0x0000015AB6EC2BA8>), (1, <itertools._grouper
object at 0x0000015AB6ED82B0>), (0, <itertools._grouper object at 0x0000015AB6E
D8518>), (1, <itertools._grouper object at 0x0000015AB6EFE780>), (0, <itertools.
_grouper object at 0x0000015AB6F028D0>)]这里的0和1值对应于原始data中的0和1s,但我们仍然有这些其他对象。这些也是发电机:
>>> [(value, list(grouper)) for value, grouper in groupby(data)]
[(0, [0, 0, 0, 0, 0]), (1, [1, 1]), (0, [0]), (1, [1, 1, 1, 1, 1, 1, 1, 1, 1,
1]), (0, [0, 0, 0, 0, 0])]现在我们可以看到发生了什么:石斑鱼对象从列表中生成块。
因此,我们所需要做的就是检查这些列表的len并获得最大值。我们修复理解,从而忽略value,获取每个grouper的len,并将结果传递给内置max,而不是列出列表:
>>> max(len(list(grouper)) for value, grouper in groupby(data))
10https://stackoverflow.com/questions/58513783
复制相似问题