Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python元组字典添加_Python_List_Loops_Dictionary_List Comprehension - Fatal编程技术网

Python元组字典添加

Python元组字典添加,python,list,loops,dictionary,list-comprehension,Python,List,Loops,Dictionary,List Comprehension,我有一个元组字典,如下所示: 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) 目前,第一个元组是2,但是我希望它从各个元组中读取值,从而得到12的正确和 因此,输出应为:

我有一个元组字典,如下所示:

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)
目前,第一个元组是2,但是我希望它从各个元组中读取值,从而得到12的正确和

因此,输出应为:

tupledict = {('A','B','C'):12, ('A',): 3, ('B',) :4, ('C',): 5}

如何做到这一点?

您可以按如下方式进行:

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)
因此,我们迭代密钥列表(我们使用
列表(…)
,这样我们就不会更新当前迭代的集合

如果
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}
或者,您可以对字典进行子类化,并覆盖
\uuu getitem\uuuu
,这样,如果请求长度大于1的元组,它会将元素添加到一起。在这种情况下,我们将节省内存(不必更新所有元组),因为元组
('a','B','C')
是隐式存储的:

例如:

>>> tupledict = {('A',): 3, ('B',) :4, ('C',): 5}
>>> sd = SumDict(tupledict)
>>> sd[('A','B','C')]
12
>>> sd[('A','B')]
7

您可以按如下方式执行此操作:

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)
因此,我们迭代密钥列表(我们使用
列表(…)
,这样我们就不会更新当前迭代的集合

如果
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}
或者,您可以对字典进行子类化,并覆盖
\uuu getitem\uuuu
,这样,如果请求长度大于1的元组,它会将元素添加到一起。在这种情况下,我们将节省内存(不必更新所有元组),因为元组
('a','B','C')
是隐式存储的:

例如:

>>> tupledict = {('A',): 3, ('B',) :4, ('C',): 5}
>>> sd = SumDict(tupledict)
>>> sd[('A','B','C')]
12
>>> sd[('A','B')]
7

您可以使用词典理解来构建新的词典:

>>> 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元组的情况。

您可以使用字典理解来构建新的dict:

>>> 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()在缺少元素的情况下,你可以考虑下面的SalasDICT和UT代码中的这个代码吗?cool@jsbueno:是的,但问题是关于修复字典的:键没有丢失,它只是错了。因此,将
\uuuu getitem\uuuuuuuuu
方法改为
\uuuu missing\uuuuue> 使用
tupledict.get((subk,),0)可能更安全在缺少元素的情况下,你可以考虑下面的SalasDICT和UT代码中的这个代码吗?cool@jsbueno:是的,但问题是关于修复字典的:键没有丢失,它只是错了。因此,将
\uuuu getitem\uuuuuuuuu
方法改为
\uuuu missing\uuuuue> 当你不得不对字典进行迭代时,你知道你做错了。当你不得不对字典进行迭代时,你知道你做错了。