Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/348.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_Python 3.x_Dictionary_Sum - Fatal编程技术网

Python字典:添加到满足给定条件的值的键和

Python字典:添加到满足给定条件的值的键和,python,python-3.x,dictionary,sum,Python,Python 3.x,Dictionary,Sum,我有以下嵌套字典,其中第一个数字是资源ID(ID总数大于100000): 我想给每个资源增加一个资源成本的总和,其得分低于给定的资源。我可以通过以下代码添加等于0的'sum_cost'键: for id in adic: dict[id]['sum_cost'] = 0 它给了我以下信息: dict = {1: {'age':1,'cost':14,'score':0.3, 'sum_cost':0}, 2: {'age':1,'cost':9,'score':0.5,

我有以下嵌套字典,其中第一个数字是资源ID(ID总数大于100000):

我想给每个资源增加一个资源成本的总和,其得分低于给定的资源。我可以通过以下代码添加等于0的'sum_cost'键:

for id in adic:
    dict[id]['sum_cost'] = 0
它给了我以下信息:

dict = {1: {'age':1,'cost':14,'score':0.3, 'sum_cost':0},
        2: {'age':1,'cost':9,'score':0.5,'sum_cost':0},
        ...}
现在我想使用理想的for循环(使代码易于阅读)为每个sum_cost分配一个值,该值等于得分低于给定ID的ID的cost之和

理想输出类似于字典,其中每个ID的“总和成本”等于分数低于给定ID的ID的成本:

dict = {1: {'age':1,'cost':14,'score':0.3, 'sum_cost':0},
        2: {'age':1,'cost':9,'score':0.5,'sum_cost':21},
        3: {'age':13,'cost':7,'score':0.4,'sum_cost':14}}

有办法吗?

注意:

dicts = {1: {'age': 1, 'cost': 14, 'score': 0.3, 'sum_cost': 0},
         2: {'age': 1, 'cost': 9, 'score': 0.5, 'sum_cost': 0},
         3: {'age': 13, 'cost': 7, 'score': 0.4, 'sum_cost': 0}}

sum_addition = 0

for key, values in sorted(dicts.items(), key=lambda x: x[1].get('score', None)):
    if dicts[key].get('score') is not None: #By default gives None when key is not available
        dicts[key]['sum_cost'] = sum_addition
        sum_addition += dicts[key]['cost']
        print key, dicts[key]
dicts = {1: {'age': 1, 'cost': 14, 'score': 0.3, 'sum_cost': 0},
         2: {'age': 1, 'cost': 9, 'score': 0.5, 'sum_cost': 0},
         3: {'age': 13, 'cost': 7, 'score': 0.4, 'sum_cost': 0}}

sum_addition = 0

for key, values in sorted(dicts.items(), key=lambda x: x[1].get('score', None)):
    if dicts[key].get('score'): #By default gives None when key is not available
        dicts[key]['sum_cost'] = sum_addition
        sum_addition += dicts[key]['cost']
        print key, dicts[key]
1 {'sum_cost': 0, 'age': 1, 'cost': 14, 'score': 0.3}
3 {'sum_cost': 14, 'age': 13, 'cost': 7, 'score': 0.4}
2 {'sum_cost': 21, 'age': 1, 'cost': 9, 'score': 0.5}
用于对与键
得分

获取字典值的步骤

并使用一个临时变量进行累计加法os
sum\u cost

代码:

dicts = {1: {'age': 1, 'cost': 14, 'score': 0.3, 'sum_cost': 0},
         2: {'age': 1, 'cost': 9, 'score': 0.5, 'sum_cost': 0},
         3: {'age': 13, 'cost': 7, 'score': 0.4, 'sum_cost': 0}}

sum_addition = 0

for key, values in sorted(dicts.items(), key=lambda x: x[1].get('score', None)):
    if dicts[key].get('score') is not None: #By default gives None when key is not available
        dicts[key]['sum_cost'] = sum_addition
        sum_addition += dicts[key]['cost']
        print key, dicts[key]
dicts = {1: {'age': 1, 'cost': 14, 'score': 0.3, 'sum_cost': 0},
         2: {'age': 1, 'cost': 9, 'score': 0.5, 'sum_cost': 0},
         3: {'age': 13, 'cost': 7, 'score': 0.4, 'sum_cost': 0}}

sum_addition = 0

for key, values in sorted(dicts.items(), key=lambda x: x[1].get('score', None)):
    if dicts[key].get('score'): #By default gives None when key is not available
        dicts[key]['sum_cost'] = sum_addition
        sum_addition += dicts[key]['cost']
        print key, dicts[key]
1 {'sum_cost': 0, 'age': 1, 'cost': 14, 'score': 0.3}
3 {'sum_cost': 14, 'age': 13, 'cost': 7, 'score': 0.4}
2 {'sum_cost': 21, 'age': 1, 'cost': 9, 'score': 0.5}
由@BernarditoLuis和@Kevin Guan提出的更为简化的方法

代码2:

dicts = {1: {'age': 1, 'cost': 14, 'score': 0.3, 'sum_cost': 0},
         2: {'age': 1, 'cost': 9, 'score': 0.5, 'sum_cost': 0},
         3: {'age': 13, 'cost': 7, 'score': 0.4, 'sum_cost': 0}}

sum_addition = 0

for key, values in sorted(dicts.items(), key=lambda x: x[1].get('score', None)):
    if dicts[key].get('score') is not None: #By default gives None when key is not available
        dicts[key]['sum_cost'] = sum_addition
        sum_addition += dicts[key]['cost']
        print key, dicts[key]
dicts = {1: {'age': 1, 'cost': 14, 'score': 0.3, 'sum_cost': 0},
         2: {'age': 1, 'cost': 9, 'score': 0.5, 'sum_cost': 0},
         3: {'age': 13, 'cost': 7, 'score': 0.4, 'sum_cost': 0}}

sum_addition = 0

for key, values in sorted(dicts.items(), key=lambda x: x[1].get('score', None)):
    if dicts[key].get('score'): #By default gives None when key is not available
        dicts[key]['sum_cost'] = sum_addition
        sum_addition += dicts[key]['cost']
        print key, dicts[key]
1 {'sum_cost': 0, 'age': 1, 'cost': 14, 'score': 0.3}
3 {'sum_cost': 14, 'age': 13, 'cost': 7, 'score': 0.4}
2 {'sum_cost': 21, 'age': 1, 'cost': 9, 'score': 0.5}
输出:

dicts = {1: {'age': 1, 'cost': 14, 'score': 0.3, 'sum_cost': 0},
         2: {'age': 1, 'cost': 9, 'score': 0.5, 'sum_cost': 0},
         3: {'age': 13, 'cost': 7, 'score': 0.4, 'sum_cost': 0}}

sum_addition = 0

for key, values in sorted(dicts.items(), key=lambda x: x[1].get('score', None)):
    if dicts[key].get('score') is not None: #By default gives None when key is not available
        dicts[key]['sum_cost'] = sum_addition
        sum_addition += dicts[key]['cost']
        print key, dicts[key]
dicts = {1: {'age': 1, 'cost': 14, 'score': 0.3, 'sum_cost': 0},
         2: {'age': 1, 'cost': 9, 'score': 0.5, 'sum_cost': 0},
         3: {'age': 13, 'cost': 7, 'score': 0.4, 'sum_cost': 0}}

sum_addition = 0

for key, values in sorted(dicts.items(), key=lambda x: x[1].get('score', None)):
    if dicts[key].get('score'): #By default gives None when key is not available
        dicts[key]['sum_cost'] = sum_addition
        sum_addition += dicts[key]['cost']
        print key, dicts[key]
1 {'sum_cost': 0, 'age': 1, 'cost': 14, 'score': 0.3}
3 {'sum_cost': 14, 'age': 13, 'cost': 7, 'score': 0.4}
2 {'sum_cost': 21, 'age': 1, 'cost': 9, 'score': 0.5}

使用OrderedICT怎么样

from collections import OrderedDict

origin_dict = {
    1: {'age':1,'cost':14,'score':0.3}, 
    2: {'age':1,'cost':9,'score':0.5}, 
    3: {'age':1,'cost':8,'score':0.45}
}
# sort by score
sorted_dict = OrderedDict(sorted(origin_dict.items(), key=lambda x: x[1]['score']))
# now all you have to do is to count sum_cost successively starting from 0
sum_cost = 0
for key, value in sorted_dict.items():
    value['sum_cost'] = sum_cost
    sum_cost += value['cost']

print sorted_dict

如果dicts[key].get('score',False)=False:在这里,如果dicts[key].get('score',False:?:)@KevinGuan可以,但只是想遵循python zen
隐式比显式好
很好的建议思想简单的
dicts[key]怎么样。get('score')
?如果该键不在dict中,它将返回
None
,请参阅。顺便说一句,如果你真的想更含蓄一些,你可以使用
如果dicts[key]。get('score',False)不是False:
(我认为它比
!=
。但是我仍然建议
如果dicts[key]。get('score',False):
(或者只要
如果dicts[key]。get('score'):
)@KevinGuan我可以把你的评论作为额外的代码添加到我的答案中吗