我有一个元组的字典如下:Python的元组字典此外
tupledict = {('A','B','C'):2, ('A',): 3, ('B',) :4, ('C',): 5}
目前,第一个元组是2,但我希望它从各个元组读取值给我12的正确的和。
所以输出应该是:
tupledict = {('A','B','C'):12, ('A',): 3, ('B',) :4, ('C',): 5}
怎么能这样做?
我有一个元组的字典如下:Python的元组字典此外
tupledict = {('A','B','C'):2, ('A',): 3, ('B',) :4, ('C',): 5}
目前,第一个元组是2,但我希望它从各个元组读取值给我12的正确的和。
所以输出应该是:
tupledict = {('A','B','C'):12, ('A',): 3, ('B',) :4, ('C',): 5}
怎么能这样做?
你可以做到这一点,如下所示:
for key in list(tupledict):
if len(key) > 1:
tupledict[key] = sum(tupledict.get((subk,),0) for subk in key)
所以我们遍历键列表(我们使用list(..)
这样,我们不更新的集合,我们正在遍历
在。情况下,len(key)
大于1,我们计算了子项的总和,并分配该值到tupledict
此构造以下字典:
>>> tupledict = {('A','B','C'):2, ('A',): 3, ('B',) :4, ('C',): 5}
>>> for key in list(tupledict):
... if len(key) > 1:
... tupledict[key] = sum(tupledict.get((subk,),0) for subk in key)
...
>>> tupledict
{('A',): 3, ('B',): 4, ('C',): 5, ('A', 'B', 'C'): 12}
或者,可以子类字典并重写__getitem__
使得如果一个请求与长度大于1的元组,其添加元素一起。在这种情况下,我们将节省内存(和没有更新的所有元组),因为元组('A','B','C')
存储隐含:
class SumDict(dict):
def __getitem__(self, key):
if len(key) > 1:
return sum(self.get((subk,) ,0) for subk in key)
else:
return super().__getitem__(key)
例如:
>>> tupledict = {('A',): 3, ('B',) :4, ('C',): 5}
>>> sd = SumDict(tupledict)
>>> sd[('A','B','C')]
12
>>> sd[('A','B')]
7
可能更安全地使用'tupledict.get((subk,),0)'? – asongtoruin
@asongtoruin:极好的建议。修改:)。 –
你可能会考虑使用子类字典并在'__missing__'方法中使用这个代码来实现一些非常酷的功能 – jsbueno
您可以使用字典理解建立一个新的字典:
>>> tupledict = {('A','B','C'): 2, ('A',): 3, ('B',): 4, ('C',): 5}
>>> {t: sum(tupledict.get((x,), 0) for x in t) for t in tupledict}
{('A', 'B', 'C'): 12, ('A',): 3, ('B',): 4, ('C',): 5}
使用tupledict.get()
而非索引处理的情况下,当一些1元组丢失。
当你不得不求助于字典迭代的时候,你知道你做错了。如果缺少元素, –