Python 元组内的滚动计数

Python 元组内的滚动计数,python,python-3.x,python-2.7,Python,Python 3.x,Python 2.7,我有一个元组列表,如下所示,输出如下: (data, Cycle 1) (data, Cycle 1) (data, Cycle 2) (data, Cycle 2) (data, Cycle 3) (data, Cycle 3) etc... 我想要每个周期的滚动计数。。。示例输出: (data, Cycle 1, 1) (data, Cycle 1, 2) (data, Cycle 2, 1) (data, Cycle 2, 2)

我有一个元组列表,如下所示,输出如下:

   (data, Cycle 1)
   (data, Cycle 1)
   (data, Cycle 2)
   (data, Cycle 2)
   (data, Cycle 3)
   (data, Cycle 3)
etc...
我想要每个周期的滚动计数。。。示例输出:

   (data, Cycle 1, 1)
   (data, Cycle 1, 2)
   (data, Cycle 2, 1)
   (data, Cycle 2, 2)
   (data, Cycle 3, 1)
   (data, Cycle 3, 2)
我可以做第一个循环:

count = 0
for i, (data, cycle) in enumerate(my_tuple):
     if cycle == 'Cycle 1':
          cumsum = count + 1
          my_tuple[i] += (cumsum,)
我被困在如何将这种情况扩展到所有周期


非常感谢您的帮助。

在这种情况下,您需要为每种循环类型保留一个运行总数,例如在一个将循环映射到其当前计数的字典中。然后在每次迭代中,相关的字典条目可以递增,并且当前值可以添加到数组中。例如,使用:

该程序将始终记录每个循环类型的总数,即使某一类型的实例之间存在间隙:例如,输入

('data', 'Cycle 1'),
('data', 'Cycle 2'),
('data', 'Cycle 1')
它将产生

('data', 'Cycle 1', 1),
('data', 'Cycle 2', 1),
('data', 'Cycle 1', 2)

在这种情况下,您可能希望为每个循环类型保留一个运行总数,例如在一个将循环映射到其当前计数的字典中。然后在每次迭代中,相关的字典条目可以递增,并且当前值可以添加到数组中。例如,使用:

该程序将始终记录每个循环类型的总数,即使某一类型的实例之间存在间隙:例如,输入

('data', 'Cycle 1'),
('data', 'Cycle 2'),
('data', 'Cycle 1')
它将产生

('data', 'Cycle 1', 1),
('data', 'Cycle 2', 1),
('data', 'Cycle 1', 2)

如果您的周期按顺序显示,您可以使用:

其中打印:

('data', 'Cycle 1', 1)
('data', 'Cycle 1', 2)
('data', 'Cycle 2', 1)
('data', 'Cycle 2', 2)
('data', 'Cycle 3', 1)
('data', 'Cycle 3', 2)

如果您的周期按顺序显示,您可以使用:

其中打印:

('data', 'Cycle 1', 1)
('data', 'Cycle 1', 2)
('data', 'Cycle 2', 1)
('data', 'Cycle 2', 2)
('data', 'Cycle 3', 1)
('data', 'Cycle 3', 2)
试试这个:

counts = {}

for i, (data, cycle) in enumerate(tup):
    cyclenum = cycle.split()[-1]
    try:
        counts[cyclenum] += 1
    except KeyError:
        counts[cyclenum] = 1
    tup[i] += (counts[cyclenum], )
试试这个:

counts = {}

for i, (data, cycle) in enumerate(tup):
    cyclenum = cycle.split()[-1]
    try:
        counts[cyclenum] += 1
    except KeyError:
        counts[cyclenum] = 1
    tup[i] += (counts[cyclenum], )

使用
dict
存储您的计数:

count = {}
for i, (data, cycle) in enumerate(my_tuple):
    cumsum = count.setdefault(cycle, 0) + 1
    count[cycle] = cumsum
    my_tuple[i] += (cumsum,)

使用
dict
存储您的计数:

count = {}
for i, (data, cycle) in enumerate(my_tuple):
    cumsum = count.setdefault(cycle, 0) + 1
    count[cycle] = cumsum
    my_tuple[i] += (cumsum,)

派对有点晚了,但请允许我顺便介绍一下完整的itertools解决方案:

from itertools import accumulate, chain, groupby
from operator import itemgetter

grouped_cycles = map(itemgetter(1), groupby(cycles, key=itemgetter(1)))
accumulate_group = lambda group: accumulate(group, lambda x, y: (y[0], y[1], x[2] + y[2]))
result = chain.from_iterable(map(accumulate_group, grouped_cycles))
在哪里

产生:

>>> list(result)
[('data', 'Cycle 1', 1), ('data', 'Cycle 1', 3), ('data', 'Cycle 2', 2)]
您可以通过将输入设为a(这样就不会有太多的
itemgetter(x)
s和魔法索引)来清理它


总的来说,我更喜欢itertools而不是重新注入油井,因为(1)它几乎肯定是正确的(并且已经被很多人测试和验证),(2)因为每个人都使用它,所以你的意图更为明确,(3)它都是用C编写的,所以(一般而言)这将比您编写的任何python都要快。

晚会有点晚了,但请允许我介绍一下完整的itertools解决方案:

from itertools import accumulate, chain, groupby
from operator import itemgetter

grouped_cycles = map(itemgetter(1), groupby(cycles, key=itemgetter(1)))
accumulate_group = lambda group: accumulate(group, lambda x, y: (y[0], y[1], x[2] + y[2]))
result = chain.from_iterable(map(accumulate_group, grouped_cycles))
在哪里

产生:

>>> list(result)
[('data', 'Cycle 1', 1), ('data', 'Cycle 1', 3), ('data', 'Cycle 2', 2)]
您可以通过将输入设为a(这样就不会有太多的
itemgetter(x)
s和魔法索引)来清理它


总的来说,我更喜欢itertools而不是重新注入油井,因为(1)它几乎肯定是正确的(并且已经被很多人测试和验证),(2)因为每个人都使用它,所以你的意图更为明确,(3)它都是用C编写的,所以(一般而言)它将比您编写的任何python都要快。

如果您的数据是有序的,您可以检查您是否与前一个不同如果您的数据是有序的,您可以检查您是否与前一个不同one@Graipher编辑了它。@Graipher编辑了它。似乎就是我要找的。干杯似乎就是我要找的。干杯