在元组内滚动计数

时间:2018-03-26 10:06:12

标签: 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 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,)

我坚持如何将这种情况扩展到所有周期。

任何帮助表示感谢。

5 个答案:

答案 0 :(得分:2)

如果您的周期按顺序显示,则可以使用itertools.groupby

from itertools import groupby

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

for key, group in groupby(Cycles, key=lambda x: x[1]):
    for number, tpl in enumerate(group, start=1):
        new_tpl = (*tpl, number)
        print(new_tpl)

打印:

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

答案 1 :(得分:1)

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

<input type="checkbox" onclick="showPW()">Show Password

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

from collections import defaultdict

my_tuple = [
   ('data', 'Cycle 1'),
   ('data', 'Cycle 1'),
   ('data', 'Cycle 2'),
   ('data', 'Cycle 2'),
   ('data', 'Cycle 3'),
   ('data', 'Cycle 3')
]

counts = defaultdict(int)

for i, (data, cycle) in enumerate(my_tuple):
    counts[cycle] += 1
    my_tuple[i] += (counts[cycle],)

print my_tuple

它会产生

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

答案 2 :(得分:1)

使用dict代替存储您的点数:

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

答案 3 :(得分:0)

试试这个:

List<T>

答案 4 :(得分:0)

参加派对有点晚了,但请允许我参加完整的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))

,其中

cycles = [('data', 'Cycle 1', 1),
          ('data', 'Cycle 1', 2),
          ('data', 'Cycle 2', 2)]

产生

>>> list(result)
[('data', 'Cycle 1', 1), ('data', 'Cycle 1', 3), ('data', 'Cycle 2', 2)]

您可以通过输入namedtuple来清理它(因此没有那么多itemgetter(x)和魔法索引浮动。)

一般来说,我更喜欢使用itertools来重新投入井,因为(1)它几乎肯定是正确的(已经过很多人测试和验证),(2)因为每个人都使用它,你的意图是更多,立即清楚,并且(3)它都是用C编写的(一般来说)它会比你写的任何python都快。