# Reducing number of if statements in Field Calculator code block of ArcGIS Pro

I am using Python 3 in ArcGIS Pro. In plain English, my goal is calculate one field in a table using a list of values from another field. I can do this with a long list of if statements, but I can't figure out the syntax to do it with lists (and maybe for loops?).

For example, let's say I have two lists:

veg = ['Carrot', 'Celery', 'Broccoli']
fruit = ['Apple', 'Banana', 'Grape']


I would essentially like to ask..."If the field contains a value from the list 'veg', return 'Vegetable', else if the field contains a value from list 'fruit', return 'Fruit', else leave null"

I know this is possible I am just having trouble with the syntax. I would like to avoid doing this ad nauseum:

if FIELD == 'Carrot':
return 'Vegetable
elif FIELD == 'Celery':
return 'Vegetable'


I know it's possible I am just struggling with the syntax. I am reducing ~40 values in one field to 2 values in another.

You can use in to check for membership:

if FIELD in veg:
return 'Vegetable'
elif FIELD in fruit:
return 'Fruit'


For bonus points use sets, which offer better performance for this:

veg = {'Carrot', 'Celery', 'Broccoli'}
fruit = {'Apple', 'Banana', 'Grape'}


I always prefer to use an UpdateCursor to update feature attributes, mainly because I find the syntax more readable and Esri has gone a long way in optimizing cursor performance. I would also recommend using the .lower() method to make sure case does not matter when checking your check lists. For example:

import arcpy

fc = r'C:\path\to\your\geodatabase.gdb\featureclass'

veg = ['Carrot', 'Celery', 'Broccoli']
fruit = ['Apple', 'Banana', 'Grape']

with arcpy.da.UpdateCursor(fc, ['produce_field', 'new_field']) as cursor:
for row in cursor:
if row[0].lower() in (x.lower() for x in veg):
row[1] = 'Vegetable'
elif row[0].lower() in (x.lower() for x in fruit):
row[1] = 'Fruit'
cursor.updateRow(row)