diff --git a/src/cityreader/cityreader.py b/src/cityreader/cityreader.py index 2bd8007ce7..28a5e90706 100644 --- a/src/cityreader/cityreader.py +++ b/src/cityreader/cityreader.py @@ -1,6 +1,15 @@ # Create a class to hold a city location. Call the class "City". It should have # fields for name, lat and lon (representing latitude and longitude). +class City: + def __init__(self, name, lat, lon): + self.name = name + self.lat = lat + self.lon = lon + + def __str__(self): + return f"{self.name}, lat: {self.lat}, lon: {self.lon}" + # We have a collection of US cities with population over 750,000 stored in the # file "cities.csv". (CSV stands for "comma-separated values".) @@ -14,6 +23,12 @@ # # Note that the first line of the CSV is header that describes the fields--this # should not be loaded into a City object. + +import os.path +import csv + +cities_csv_path = os.path.join(os.path.dirname(__file__), 'cities.csv') + cities = [] def cityreader(cities=[]): @@ -21,6 +36,13 @@ def cityreader(cities=[]): # 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_path, newline='') as csv_file: + reader = csv.reader(csv_file, delimiter=',') + next(reader) + + for row in reader: + cities.append(City(row[0], float(row[3]), float(row[4]))) return cities @@ -29,6 +51,7 @@ def cityreader(cities=[]): # Print the list of cities (name, lat, lon), 1 record per line. for c in cities: print(c) +print(len(cities)) # STRETCH GOAL! # @@ -68,4 +91,8 @@ def cityreader_stretch(lat1, lon1, lat2, lon2, cities=[]): # Go through each city and check to see if it falls within # the specified coordinates. + for city in cities: + if (min(lat1, lat2) <= city.lat <= max(lat1, lat2)) and (min(lon1, lon2) <= city.lon <= max(lon1, lon2)): + within.append(city) + return within diff --git a/src/comp/comp.py b/src/comp/comp.py index 82f8821d63..f48b84a66c 100644 --- a/src/comp/comp.py +++ b/src/comp/comp.py @@ -24,48 +24,92 @@ def __repr__(self): # Write a list comprehension that creates a list of names of everyone # whose name starts with 'D': print("Starts with D:") +# This is the short version: +# a = [h.name for h in humans if h.name[0] == "D"] + +# Another way of doing it: a = [] +for human in humans: + if human.name.startswith("D"): + a.append(human.name) print(a) # Write a list comprehension that creates a list of names of everyone # whose name ends in "e". -print("Ends with e:") b = [] +for human in humans: + if human.name.endswith("e"): + b.append(human.name) +print("Ends with 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:") + +# ****************************** Another way of doing it ******************************** +# c = [] +# first_letters = ("C", "D", "E", "F", "G") +# for human in humans: +# if human.name.startswith(first_letters): +# c.append(human.name) +# print("Starts between C and G, inclusive:") +# print(c) + c = [] +for human in humans: + if any(human.name.startswith(x) for x in "CDEFG"): + c.append(human.name) +print("Starts between C and G, inclusive:") print(c) # Write a list comprehension that creates a list of all the ages plus 10. -print("Ages plus 10:") d = [] +for human in humans: + #human.age + 10 + d.append(human.age + 10) +print("Ages plus 10:") 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 = [] +for human in humans: + e.append(human.name + "-" + str(human.age)) +print("Name hyphen age:") 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:") + +# ****************************** Another way of doing it ******************************** +# f = [] +# for human.age in range(27 and 32): +# f.append(f"{human.name}, {human.age}") +# print("Names and ages between 27 and 32:") +# print(f) + f = [] +for human in humans: + x = (human.name, human.age) + if human.age in range(27, 33): + f.append(x) +print("Names and ages between 27 and 32:") 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 = [] +for human in humans: + g.append(f"{human.name.upper()}, {human.age + 5}") +print("All names uppercase:") print(g) # Write a list comprehension that contains the square root of all the ages. -print("Square root of ages:") import math h = [] -print(h) +for human in humans: + h.append(math.sqrt(human.age)) +print("Square root of ages:") +print(h) \ No newline at end of file diff --git a/src/comp/test_comp.py b/src/comp/test_comp.py index 7e97213290..f15ddc6276 100644 --- a/src/comp/test_comp.py +++ b/src/comp/test_comp.py @@ -1,5 +1,6 @@ import unittest -from comp import * +from comp import Human +from comp import a, b, c, d, e, f, g, h def compare_humans(inp, exp): if len(inp) != len(exp): diff --git a/src/oop/oop1.py b/src/oop/oop1.py index b7268c5263..3505af42ad 100644 --- a/src/oop/oop1.py +++ b/src/oop/oop1.py @@ -17,3 +17,28 @@ # pass # # Put a comment noting which class is the base class +# + +# Base Class: +class Vehicle: + pass + +# GroundVehicle and Subclass +class GroundVehicle(Vehicle): + pass + +class Car(GroundVehicle): + pass + +class Motorcycle(GroundVehicle): + pass + +#FlightVehicle and Subclasses +class FlightVehicle(Vehicle): + pass + +class Airplane(FlightVehicle): + pass + +class Starship(FlightVehicle): + pass diff --git a/src/oop/oop2.py b/src/oop/oop2.py index 29d3e481fe..e833cf4216 100644 --- a/src/oop/oop2.py +++ b/src/oop/oop2.py @@ -4,10 +4,11 @@ # 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. @@ -17,7 +18,13 @@ def __init__(self, num_wheels): # # Override the drive() method in Motorcycle so that it returns "BRAAAP!!" -# TODO +class Motorcycle(GroundVehicle): + def __init__(self): + super().__init__(2) + + def drive(self): + return "BRAAAP!!" + vehicles = [ GroundVehicle(), @@ -30,3 +37,5 @@ 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())