2015-12-10 3 views
1

У меня есть ниже список с 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'},] 

Am пытается пройти через все значения из списка выше и обновить их, как показано ниже:

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) 

Проблема с таким подходом заключается в том, что , например, cat['value'] для имени Банковское дело: 8 , поэтому выше, если условие установит значение в 40.

, а затем в цикле, cat['value'] Фильмы стали 8 из 4, а позже обновляется в 40 .. (теперь он испортил cat['values'])

Таким образом, этот подход обновления неверен точно.

Как я могу обновить cat['values'] моего списка, основанных на этих множественных условиях?

Может быть, я могу обрамляю, если условия в другой список, если требуется, как этот [{2:1},{3:4},{4:8},{5:12},....]

Не могли бы вы мне помочь с подходом, о том, как я могу получить мои cat['values'] обновляются в соответствии с условиями выше?

+1

использование 'elif' (читай«еще, если») вместо' if' кроме первого 'if' – DainDwarf

ответ

3

Вы также можете записать свои преобразования в dict, а затем получить доступ к dict по старому значению и перезаписать значение dict.

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

также вы можете использовать lamda, но немного сложно понять –

+0

Мне очень нравится ваш ответ, но если OP не знает 'elif', у него могут возникнуть проблемы с пониманием этого. Может быть, добавление объяснений поможет. – Altoyyr

+0

Привет, Али Никнесхан, это лучшее решение для конверсий, чем в случае условий elif? Какой из них лучший? –

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: Вам не нужно() вокруг if в питоне

+0

Большое спасибо Altoyr !, Я попробую его сейчас. –

+0

добро пожаловать – Altoyyr

1

Просто используйте elif для 2-го и последующих сравнений:

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

Спасибо большое Eugene! –

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 заявление, как только вы нашли значение, чтобы перейти к следующей категории.)

+0

Спасибо большое Мартину! –

Смежные вопросы