我想做以下事情:
d = defaultdict((int,float))
for z in range( lots_and_lots):
d['operation one'] += (1,5.67)
...
...
d['operation two'] += (1,4.56)
然后输出每个操作被调用的次数和浮点值的总和。
for k,v in d.items():
print k, 'Called', v[0], 'times, total =', v[1]
但我不知道如何实现这一点,因为你不仅不能使用一个元组作为一个参数来默认,你不能添加一个元组到一个元组,并在元组中合计的值,你只是得到额外的值在你的元组。即:
>>> x = (1,0)
>>> x+= (2,3)
>>> x
(1, 0, 2, 3)
而不是
>>> x = (1,0)
>>> x+= (2,3)
>>> x
(3,3)
我怎样才能得到我想要的?
6条答案
按热度按时间pb3skfrl1#
您可以使用 collections.Counter 来累计结果:
ebdffaop2#
defaultdict
的参数必须是一个返回默认值的“可调用的”。定义你的默认dict如下:int
和float
类型可以被调用并返回零的事实是一种便利,但对defaultdict的工作方式并不重要。让
+=
工作会引起一些麻烦;元组间的加法是元组的串联,所以你必须走很长的路:**编辑:**如果你 * 必须 * 使用+=,你可以这样做,只要你有一个集合类型,它有你想要的操作。fileoffset suggests使用一个
numpy
数组类型,这可能是一个好主意,但是你可以通过子类化tuple
并覆盖你需要的操作符来得到一个近似的结果:下面是其中一个的草图:我们不需要(或不想)重载
+=
运算符本身(拼写为__iadd__
),因为tuple
是不可变的。如果你提供加法,Python会正确地用新值替换旧值。atmip9wb3#
我假设您有太多的操作,以至于不能简单地在每个条目中存储值列表?
您可以做的一件事是创建一个自定义增量器:
然后
q1qsirdb4#
编写一个可以传递到
defaultdict
中的类,在传递值时累加这些值:这是对你原始文章中
(int, float)
的直接替换,改变你的输出循环,打印示例属性如下:......你就完了!
5lhxktic5#
如果你使用numpy数组,你可以得到想要的输出:
链接
hc8w905p6#
试试这个:
例如: