Python Forum
Help with list sorting - Printable Version

+- Python Forum (https://python-forum.io)
+-- Forum: Python Coding (https://python-forum.io/forum-7.html)
+--- Forum: Homework (https://python-forum.io/forum-9.html)
+--- Thread: Help with list sorting (/thread-13447.html)



Help with list sorting - gonzo620 - Oct-15-2018

Can someone help with my assignment. I have most of the code written theres just a few errors I need help with.
the text file and assignment: https://transfernow.net/49ffh2n6pjez

The code:
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])
Any help would be greatly appreciated. Thank!

(Oct-15-2018, 08:55 PM)gonzo620 Wrote: Can someone help with my assignment. I have most of the code written theres just a few errors I need help with.
the text file and assignment: https://transfernow.net/49ffh2n6pjez

The code:
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])
Any help would be greatly appreciated. Thank!

Mainly the issues are with my sorting


RE: Help with list sorting - j.crater - Oct-16-2018

It would be helpful if you provided sample input data you use, the (incorrect) result you get, and result you want to get.