2017-09-14 71 views
1

我有一个元组的字典如下: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} 

怎么能这样做?

+0

当你不得不求助于字典迭代的时候,你知道你做错了。如果缺少元素, –

回答

3

你可以做到这一点,如下所示:

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 
+0

可能更安全地使用'tupledict.get((subk,),0)'? – asongtoruin

+0

@ason​​gtoruin:极好的建议。修改:)。 –

+0

你可能会考虑使用子类字典并在'__missing__'方法中使用这个代码来实现一些非常酷的功能 – jsbueno

4

您可以使用字典理解建立一个新的字典:

>>> 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元组丢失。