Oct-11-2018, 01:55 AM
If you want to sort them by distance (closest first), you'll need to create a list of cities and use the list.sort() method. You could append the distance to each line from the file, append them to your lists as you already are, and then use the sort method.
If you only want to report cities within a specified distance, you should add a conditional to only append cities under that distance. Again, you'll want to append the distance to the line.
Something like this should work for the sorting option (you may have to fiddle with the key argument):
If you only want to report cities within a specified distance, you should add a conditional to only append cities under that distance. Again, you'll want to append the distance to the line.
Something like this should work for the sorting option (you may have to fiddle with the key argument):
with open('cities.txt','r', encoding = 'cp1252') as fin: # opens file with read permission import math season = input('Will you take your vacation during summer or winter? ') climate = input('Do you want to go to a warm or a cold place? ') coldsummer = [] # these are empty lists that will be filled in later warmsummer = [] coldwinter = [] warmwinter = [] data = fin.read().splitlines(True) for line in data[1:-1]: line = line.split('\t') # splits elements in line with a tab lat = line[0] # these assign variables to certain parts of the file long = line[1] city = line[2] lat_deg = int(lat[0:2].strip('°').strip('N').strip('S')) # strips non integer parts lat_min = int(lat[3:5].strip('°').strip('N').strip('S')) long_deg = int(long[0:2].strip('°').strip('E').strip('W')) long_min = int(long[3:5].strip('°').strip('E').strip('W')) lat_DMS = lat_deg + (lat_min/60) # converts to degree-minute-second lat_rad = lat_DMS*(math.pi/180) # converts to radian long_DMS = long_deg + (long_min/60) long_rad = long_DMS*(math.pi/180) R = 6360 # assumed radius of Earth Mercedlat_DMS = 37 + 22/60 # coordinate for Merced, CA in degree-minute-second Mercedlat_rad = Mercedlat_DMS*(math.pi/180) # in radians Mercedlong_DMS = 107 + 25/60 Mercedlong_rad = Mercedlong_DMS*(math.pi/180) distance = 2*R*math.sin(math.sqrt(math.sin((lat_rad - Mercedlat_rad)/2)**2 + # distance formula math.cos(lat_rad)*math.cos(Mercedlat_rad) * math.sin((long_rad - Mercedlong_rad)/2)**2))**-1 line.append(distance) if lat_deg > 66: # these if statements will fill in lists with appropriate values coldsummer.append(line) coldwinter.append(line) elif lat_deg > 35 and lat_deg < 66: warmsummer.append(line) coldwinter.append(line) else: warmsummer.append(line) warmwinter.append(line) def sortByDistance(cityStats): return cityStats[len(cityStats - 1)] """ The key argument requires a function or method that will act upon each item in the list. The function defined above should suffice in this case. In effect, list.sort() does this with more finesse: length = len(self) for i in range(length): if key(self[i]) > key(self[i + 1]): swap(self[i], self[i + 1]) """ coldsummer.sort(key = sortByDistance) warmsummer.sort(key = sortByDistance) coldwinter.sort(key = sortByDistance) warmwinter.sort(key = sortByDistance) for x in warmsummer: # the for loops will take desired list and print values if season == 'summer': if climate == 'warm': print(x[2]) for x in coldsummer: if season == 'summer': if climate == 'cold': print(x[2]) for x in warmwinter: if season == 'winter': if climate == 'warm': print(x[2]) for x in coldwinter: if season == 'winter': if climate == 'cold': print(x[2])