amavicpos

Posted on

# Vegetarian restaurant recommendation in Python (using quicksort)

This is a project I did for the Computer Science Path in Codecademy. It asks some questions to the user in order to provide an ordered list of vegetarian options in London (the restaurants are fake), from most suitable to least.

``````from random import randrange, shuffle

def quicksort_two_lists(list, list2, start, end):
# this portion of list has been sorted
if start >= end:
return
# select random element to be pivot
pivot_idx = randrange(start, end + 1)
pivot_element = list[pivot_idx]
# swap random element with last element in sub-lists
list[end], list[pivot_idx] = list[pivot_idx], list[end]
list2[end], list2[pivot_idx] = list2[pivot_idx], list2[end]

# tracks all elements which should be to left (greater than) pivot
greater_than_pointer = start

for i in range(start, end):
# we found an element out of place
if list[i] > pivot_element:
# swap element to the right-most portion of greater elements
list[i], list[greater_than_pointer] = list[greater_than_pointer], list[i]
list2[i], list2[greater_than_pointer] = list2[greater_than_pointer], list2[i]
# tally that we have one more greater element
greater_than_pointer += 1
# move pivot element to the right-most portion of greater elements
list[end], list[greater_than_pointer] = list[greater_than_pointer], list[end]
list2[end], list2[greater_than_pointer] = list2[greater_than_pointer], list2[end]
# recursively sort left and right sub-lists
quicksort_two_lists(list, list2, start, greater_than_pointer - 1)
quicksort_two_lists(list, list2, greater_than_pointer + 1, end)

class Restaurant:
def __init__(self, name, location, price, type, space, reviews):
self.name = name
self.location = location
self.price = price
self.type = type
self.space = space
self.reviews = reviews

def __repr__(self):
description = "{}\nLocation: {}\nValue for money: {}/5\nType: {}\nSpace: {}/5\nOverall rate of reviews: {}/5".format(self.name, self.location, self.price, self.type, self.space, self.reviews)
return description

veggie_world = Restaurant("Veggie World", "London City", 3, "Vegan", 3, 4)
tomato_love = Restaurant("Tomato Love", "Greenwich", 4, "Ovo-lacto vegetarian", 4, 4)
plant_rainbow = Restaurant("Plant Rainbow", "Camden", 2, "Ovo-lacto vegetarian", 5, 3)
vegan_teriyaki = Restaurant("Vegan Teriyaki", "Greenwich", 4, "Vegan", 4, 5)
peace_for_you = Restaurant("Peace for You", "London City", 3, "Vegan", 4, 4)
sauce_for_the_soul = Restaurant("Sauce for the Soul", "London City", 4, "Ovo-lacto vegetarian", 2, 4)
seitan_and_co = Restaurant("Seitan and Company", "Camden", 3, "Ovo-lacto vegetarian", 4, 4)
eat_your_greens = Restaurant("Eat your Greens", "London City", 4, "Ovo-lacto vegetarian", 3, 5)

restaurants_dict = {veggie_world: 0, tomato_love: 0, plant_rainbow: 0, vegan_teriyaki: 0, peace_for_you: 0, green_madness: 0, \
sauce_for_the_soul: 0, kill_the_salad: 0, seitan_and_co: 0, eat_your_greens: 0}

while True:
location = input("Is location important? Enter yes/no: ")
if location in {"yes", "no"}:
break

if location == "yes":
while True:
location = input("Where would you like to eat?\n1. London City\n2. Greenwich\n3. Camden\nEnter the corresponding number: ")
if location in {"1", "2", "3"}:
break

if location == "1":
for key in restaurants_dict.keys():
if key.location == "London City":
restaurants_dict[key] += 5
elif key.location == "Greenwich":
restaurants_dict[key] += 1
elif key.location == "Camden":
restaurants_dict[key] += 2
elif location == "2":
for key, value in restaurants_dict.items():
if key.location == "London City":
restaurants_dict[key] += 1
elif key.location == "Greenwich":
restaurants_dict[key] += 5
elif location == "3":
for key, value in restaurants_dict.items():
if key.location == "London City":
restaurants_dict[key] += 2
elif key.location == "Camden":
restaurants_dict[key] += 5

while True:
price = input("Is quality for money important? Enter yes/no: ")
if price in {"yes", "no"}:
break

while True:
type = input("What type of cuisine do you prefer? Enter vegan/ovo-lacto vegetarian: ")
if type in {"vegan", "ovo-lacto vegetarian"}:
break

while True:
space = input("Is having space and being comfortable important? Enter yes/no: ")
if space in {"yes", "no"}:
break

while True:
reviews = input("Is the general rating of customers important? Enter yes/no: ")
if reviews in {"yes", "no"}:
break

for key in restaurants_dict.keys():
if price == "yes":
restaurants_dict[key] += key.price
if key.type == type:
restaurants_dict[key] += 3
if space == "yes":
restaurants_dict[key] += key.space
if reviews == "yes":
restaurants_dict[key] += key.reviews

keys = list(restaurants_dict.keys())
values = list(restaurants_dict.values())

quicksort_two_lists(values, keys, 0, len(values)-1)
order = 1
pre_value = values[0]
print("\nRestaurant recommendations, from most suitable to least:")
for key, value in zip(keys, values):
if pre_value != value:
order += 1
print(str(order) + ".", key, "\n")
pre_value = value
``````