diff --git a/src/cityreader/cityreader.py b/src/cityreader/cityreader.py index 2bd8007ce7..162ad35d38 100644 --- a/src/cityreader/cityreader.py +++ b/src/cityreader/cityreader.py @@ -5,45 +5,63 @@ # We have a collection of US cities with population over 750,000 stored in the # file "cities.csv". (CSV stands for "comma-separated values".) # -# In the body of the `cityreader` function, use Python's built-in "csv" module +# In the body of the `cityreader` function, use Python's built-in "csv" module # to read this file so that each record is imported into a City instance. Then # return the list with all the City instances from the function. -# Google "python 3 csv" for references and use your Google-fu for other examples. +# Google "python 3 csv" for references and use your Google-fu for other +# examples. # # Store the instances in the "cities" list, below. # # Note that the first line of the CSV is header that describes the fields--this # should not be loaded into a City object. + +import csv + cities = [] + +class City: + def __init__(self, name, lat, lon): + self.name = name + self.lat = float(lat) + self.lon = float(lon) + pass + + def cityreader(cities=[]): - # TODO Implement the functionality to read from the 'cities.csv' file - # Ensure that the lat and lon valuse are all floats - # For each city record, create a new City instance and add it to the - # `cities` list - - return cities + # TODO Implement the functionality to read from the 'cities.csv' file + # Ensure that the lat and lon valuse are all floats + # For each city record, create a new City instance and add it to the + # `cities` list + with open('cities.csv', newline='') as csvfile: + reader = csv.DictReader(csvfile) + for row in reader: + city = City(row['city'], row['lat'], row['lng']) + cities.append(city) + return cities cityreader(cities) # Print the list of cities (name, lat, lon), 1 record per line. for c in cities: - print(c) + print(c.name, c.lat, c.lon) # STRETCH GOAL! # # Allow the user to input two points, each specified by latitude and longitude. -# These points form the corners of a lat/lon square. Pass these latitude and +# These points form the corners of a lat/lon square. Pass these latitude and # longitude values as parameters to the `cityreader_stretch` function, along -# with the `cities` list that holds all the City instances from the `cityreader` -# function. This function should output all the cities that fall within the -# coordinate square. +# with the `cities` list that holds all the City instances from the +# `cityreader`function. This function should output all the cities that fall +# within the coordinate square. # # Be aware that the user could specify either a lower-left/upper-right pair of -# coordinates, or an upper-left/lower-right pair of coordinates. Hint: normalize -# the input data so that it's always one or the other, then search for cities. -# In the example below, inputting 32, -120 first and then 45, -100 should not -# change the results of what the `cityreader_stretch` function returns. +# coordinates, or an upper-left/lower-right pair of coordinates. Hint: +# normalize the input data so that it's always one or the other, then search +# for cities.In the example below, inputting 32, -120 first and then +# 45, -100 should not change the results of what the `cityreader_stretch` +# function returns. # # Example I/O: # @@ -60,12 +78,32 @@ def cityreader(cities=[]): # Salt Lake City: (40.7774,-111.9301) # TODO Get latitude and longitude values from the user +# This is where we will enter 45, -100 and 32, -120 +checking_lat_1, checking_lon_1 = input("Enter lat and lon #1: ").split() +checking_lat_2, checking_lon_2 = input("Enter lat and lon #2: ").split() + def cityreader_stretch(lat1, lon1, lat2, lon2, cities=[]): - # within will hold the cities that fall within the specified region - within = [] - - # Go through each city and check to see if it falls within - # the specified coordinates. + # within will hold the cities that fall within the specified region + if lat1 > lat2: + xlat = float(lat1) + ylat = float(lat2) + else: + xlat = float(lat2) + ylat = float(lat1) + if lon1 > lon2: + xlon = float(lon1) + ylon = float(lon2) + else: + xlon = float(lon2) + ylon = float(lon1) + + within = [city for city in cities if (city.lat < xlat) and + (city.lat > ylat) and + (city.lon < xlon) and + (city.lon > ylon)] + +# Go through each city and check to see if it falls within +# the specified coordinates. - return within + return within diff --git a/src/comp/comp.py b/src/comp/comp.py index 82f8821d63..c64742eda5 100644 --- a/src/comp/comp.py +++ b/src/comp/comp.py @@ -1,5 +1,8 @@ -# The following list comprehension exercises will make use of the -# defined Human class. +# The following list comprehension exercises will make use of the +# defined Human class. +import math + + class Human: def __init__(self, name, age): self.name = name @@ -24,48 +27,47 @@ def __repr__(self): # Write a list comprehension that creates a list of names of everyone # whose name starts with 'D': print("Starts with D:") -a = [] +a = [h.name for h in humans if h.name[0] == 'D'] print(a) # Write a list comprehension that creates a list of names of everyone # whose name ends in "e". print("Ends with e:") -b = [] +b = [h.name for h in humans if h.name[-1] == 'e'] print(b) # Write a list comprehension that creates a list of names of everyone # whose name starts with any letter between 'C' and 'G' inclusive. print("Starts between C and G, inclusive:") -c = [] +c = [h.name for h in humans if h.name[0] in ["C", "D", "E", "F", "G"]] print(c) # Write a list comprehension that creates a list of all the ages plus 10. print("Ages plus 10:") -d = [] +d = [h.age + 10 for h in humans] print(d) # Write a list comprehension that creates a list of strings which are the name # joined to the age with a hyphen, for example "David-31", for all humans. print("Name hyphen age:") -e = [] +e = [f'{h.name}-{h.age}' for h in humans] print(e) # Write a list comprehension that creates a list of tuples containing name and # age, for example ("David", 31), for everyone between the ages of 27 and 32, # inclusive. print("Names and ages between 27 and 32:") -f = [] +f = [(h.name, h.age) for h in humans if (h.age <= 32) and (h.age >= 27)] print(f) # Write a list comprehension that creates a list of new Humans like the old # list, except with all the names uppercase and the ages with 5 added to them. # The "humans" list should be unmodified. print("All names uppercase:") -g = [] +g = [Human(h.name.upper(), h.age + 5) for h in humans] print(g) # Write a list comprehension that contains the square root of all the ages. print("Square root of ages:") -import math -h = [] +h = [math.sqrt(h.age) for h in humans] print(h) diff --git a/src/oop/oop1.py b/src/oop/oop1.py index b7268c5263..7d552e7480 100644 --- a/src/oop/oop1.py +++ b/src/oop/oop1.py @@ -17,3 +17,31 @@ # pass # # Put a comment noting which class is the base class + + +class Vehicle: + pass + + +class GroundVehicle(Vehicle): + pass + + +class Car(GroundVehicle): + pass + + +class Motorcycle(GroundVehicle): + pass + + +class FlightVehicle(Vehicle): + pass + + +class Starship(FlightVehicle): + pass + + +class Airplane(FlightVehicle): + pass diff --git a/src/oop/oop2.py b/src/oop/oop2.py index 29d3e481fe..80bdcc78ff 100644 --- a/src/oop/oop2.py +++ b/src/oop/oop2.py @@ -3,22 +3,31 @@ # Also change it so the num_wheels defaults to 4 if not specified when the # object is constructed. + class GroundVehicle(): - def __init__(self, num_wheels): + def __init__(self, num_wheels=4): self.num_wheels = num_wheels - # TODO + def drive(self): + return "vroooom" # Subclass Motorcycle from GroundVehicle. # -# Make it so when you instantiate a Motorcycle, it automatically sets the number -# of wheels to 2 by passing that to the constructor of its superclass. -# +# Make it so when you instantiate a Motorcycle, it automatically +# sets the number of wheels to 2 by passing that to the +# constructor of its superclass. # Override the drive() method in Motorcycle so that it returns "BRAAAP!!" # TODO +class Motorcycle(GroundVehicle): + def __init__(self): + super().__init__(num_wheels=2) + + def drive(self): + return "BRAAAP!!" + vehicles = [ GroundVehicle(), GroundVehicle(), @@ -30,3 +39,6 @@ def __init__(self, num_wheels): # Go through the vehicles list and print the result of calling drive() on each. # TODO + +for vehicle in vehicles: + print(vehicle.drive())