我有一个元组列表如下,输出如下:
(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,)
我坚持如何将这种情况扩展到所有周期。
任何帮助表示感谢。
答案 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都快。