无法修改python列表中的字段

时间:2015-12-10 10:39:57

标签: python python-3.x if-statement

我在下面列出了dicts:

categories=[
{'id':0,'value':8,'name':'Banking'},
{'id':1,'value':5,'name':'Home'},
{'id':2,'value':2,'name':'Travel'},
{'id':3,'value':4,'name':'Movies'},
{'id':4,'value':7,'name':'Hiking'},
{'id':5,'value':9,'name':'Food'},]

我试图浏览上面列表中的所有值并按以下方式更新它们:

    for cat in categories:
        if(cat['value']==2):
            cat['value']=1
        if(cat['value']==3):
            cat['value']=4
        if(cat['value']==4):
            cat['value']=8
        if(cat['value']==5):
            cat['value']=12
        if(cat['value']==8):
            cat['value']=40
......
(from 2 till 10 in if condition)

这种方法的问题在于, 例如,名称Banking的cat['value']为8 所以如果条件将值设置为40。

以及稍后的循环中,电影的cat['value']从4开始变为8,后来更新为40 ​​..(现在它搞砸了cat['values']

因此,这种更新方法肯定是不正确的。

如何根据这些多个条件更新列表中的cat['values']

如果需要,可以将if条件框架为另一个列表 [{2:1},{3:4},{4:8},{5:12},....]

请您帮我解决一下我如何根据上述条件更新cat['values']的方法?

4 个答案:

答案 0 :(得分:3)

只需使用elif一次更新值(official doc on control-flows

for cat in categories:
    if cat['value'] == 2:
        cat['value'] = 1
    elif cat['value'] == 3:
        cat['value'] = 4
    elif cat['value'] == 4:
        cat['value'] = 8
    elif cat['value'] == 5:
        cat['value'] = 12
    elif cat['value'] == 8:
        cat['value'] = 40

PS:你不需要python中if周围的()

答案 1 :(得分:3)

您还可以将转换写入dict,然后通过旧值访问dict并使用dict的值覆盖。

conversions ={2:1,3:4,4:8,..}
for cat in categories:
    cat['values']=conversions[cat['values']]

答案 2 :(得分:1)

只需使用elif进行第二次及以后的比较:

if cat['value'] == 2:
    cat['value'] = 1
elif cat['value'] == 3:
    cat['value'] = 4 
...

或者,您可以使用字典重新映射值:

values = {2: 1, 3: 4, 4: 8, 5: 12, 8: 40}
cat["value"] = values[cat["value"]]

答案 3 :(得分:1)

而不是一系列if语句,将其设为一个elif链。

    for cat in categories:
        if(cat['value']==2):
            cat['value']=1   
        elif(cat['value']==3):
            cat['value']=4
        elif(cat['value']==4):
            cat['value']=8
        elif(cat['value']==5):
            cat['value']=12
        elif(cat['value']==8):
            cat['value']=40

(或者,您可以在找到值后使用continue语句转到下一个类别。)