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编辑了它。似乎就是我要找的。干杯似乎就是我要找的。干杯