# Python: Planning Lunches and Groceries

I bring my lunch to work to avoid food poisoning (I have food allergies, not paranoia). To be able to make these lunches for work when exhausted, I’d like a list of what to pack for a set number of days.

Today, I solved this problem by writing foodplan.py

from random import randint

protein= [‘2 hard boiled eggs’, ‘1 chicken sausage’, ‘1 serving soup’]
grains = [‘1 serving baby rice’, ‘1 serving overnight GF oatmeal’]
sides = [‘apples’, ‘coffee’, ‘plain’, ‘blueberries’, ‘bananas’]
fruit_veg = [‘cherry tomatoes’, ‘grapes’, ‘bell peppers’, ‘cucumbers’, ‘apples’]

def generate():
print “How many days? n”
days = int(raw_input())
[one_meal() for day in xrange(days)]

def one_meal():
print “%s n %s with %s n %s nn” %(protein[randint(0, len(protein)-1)], grains[randint(0, len(grains)-1)], sides[randint(0, len(sides)-1)], fruit_veg[randint(0, len(fruit_veg)-1)])

if __name__ == ‘__main__’:
generate()


If, like me, your hatred for hard code exceeds your wariness of eval, you can rewrite one_meal() as two functions:

from random import randint

protein= [‘2 hard boiled eggs’, ‘1 chicken sausage’, ‘1 serving soup’]
grains = [‘1 serving baby rice’, ‘1 serving overnight GF oatmeal’]
sides = [‘apples’, ‘coffee’, ‘plain’, ‘blueberries’, ‘bananas’]
fruit_veg = [‘cherry tomatoes’, ‘grapes’, ‘bell peppers’, ‘cucumbers’, ‘apples’]

def generate():
print “How many days? n”
days = int(raw_input())
[one_meal() for day in xrange(days)]

def one_meal():
print ” %s n %s with %s n %s nn” % (pick(‘protein’), pick(‘grains’), pick(‘sides’), pick(‘fruit_veg’))

def pick(name):
func = eval(name)
return func[randint(0, len(func)-1)]

if __name__ == ‘__main__’:
generate()


Adjust the contents of the arrays at the beginning to make this code applicable to your lunch planning desires.

Last year, I wanted to email myself grocery lists. I wrote foodemail.py to solve this problem (seems that my tastes haven’t changed much):

import smtplib
from datetime import datetime
import get

groceries = [“Hey! nnThe grocery list for this week is as follows: nn”]
food = {‘protein’: [[‘hummus’, 1.5, 780],[‘honey roasted turkey’, 0.75, 270],[‘tofu’, 0.4, 500], [‘soup’, 1.5, 250]], ‘drinks’: [[‘diet ginger ale(packs of 12)’, 0.5], [‘water bottles’, 3], [‘unsweetened almond/soy milk’, 0.75]], ‘fruit/veg’: [[‘oranges/clementines’, .2, 60],[‘bananas(bunch)’, .2, 80],[‘green apples’, 3, 80], [‘salad’, 1/3, 40], [‘frozen corn’, 0.5, 100],[‘green peppers’, 2, 15]]}

# Calculate run time
runtime=datetime.now() - starttime
# Initialize SMTP server
server=smtplib.SMTP(‘smtp.gmail.com:587’)
server.starttls()
# Send email
senddate=datetime.strftime(datetime.now(), ‘%Y-%m-%d’)
subject=”Grocery List for this week”
msg=message
server.quit()

if __name__ == ‘__main__’:
# Start time of script
starttime=datetime.now()
# Fill these in with the appropriate info…
usr=’YOUREMAIL’
toaddr= [‘RECIPIENT@SERVER.COM’, ‘RECIPIENT2@SERVER.COM’] #As many recipients as you like
#creates appropriate grocery info
index = [‘protein’, ‘drinks’, ‘fruit/veg’]
print “Days?"
days = int(raw_input())
for x in range(0, len(food)):
for y in range(0, len(food[index[x]])-1):
if int(days*food[index[x]][y][1]) > 0:
string = ‘t’ + food[index[x]][y][0] + ‘ x%d n’ % int(days*food[index[x]][y][1])
groceries.append(string)
else: pass
print ‘ ‘.join(str(k) for k in groceries)
print “Enter 0 if satisfactory, enter 1 to add to the list: “
user = int(raw_input())
if user == 0: pass
elif user == 1:
print “What would you like to add?”
y = [x.strip() for x in addition.split(‘,’)]
for x in xrange(0, len(y)):
groceries.append(“t%s n” % y[x])
groceries.append(“nCheers! nt tRin”)
msg = ‘ ‘.join(str(k) for k in groceries)


Looking at foodemail.py, I see that my coding has become more efficient over this past year.

I hope that these programs are useful for your food planning!

Written on June 9, 2013