May-16-2021, 02:51 PM
Hi everyone,
Im doing an homework assigment and I keep getting False, I finally found the problem which is because the list isnt sort right but I have no clue how to fix that:
the first part was to create a dict that give you the name of country and the number of medals they won:
I think that the reason is in the second function that return dict of shortcut and full name, because the shortcut of British Virgin Islands in the file is IVB, but as I said at the start.. I have no clue how to fix that. appreciate any help
Im doing an homework assigment and I keep getting False, I finally found the problem which is because the list isnt sort right but I have no clue how to fix that:
the first part was to create a dict that give you the name of country and the number of medals they won:
def read_file_countries(file): """bndbsnbdgffdvbvcbvbvbggdfm""" with open(file, "r") as my_csv: next(my_csv) new_dict = {} for line in my_csv.readlines(): line = line.split(",") ind1 = line[1].strip() ind2 = line[6].strip() ind3 = line[7].strip() ind4 = line[8].strip() ind5 = line[9].strip() new_dict[ind1] = {"Gold":ind2, "Silver":ind3, "Bronze": ind4, "Total": ind5} if new_dict[ind1]["Gold"] == '': new_dict[ind1]["Gold"] = "0" if new_dict[ind1]["Silver"] == '': new_dict[ind1]["Silver"] = "0" if new_dict[ind1]["Bronze"] == '': new_dict[ind1]["Bronze"] = "0" if new_dict[ind1]["Total"] == '': new_dict[ind1]["Total"] = "0" for x in new_dict[ind1]["Gold"]: integer1 = int(new_dict[ind1]["Gold"]) for x in new_dict[ind1]["Silver"]: integer2 = int(new_dict[ind1]["Silver"]) for x in new_dict[ind1]["Bronze"]: integer3 = int(new_dict[ind1]["Bronze"]) for x in new_dict[ind1]["Total"]: integer4 = int(new_dict[ind1]["Total"]) new_dict[ind1] = {"Gold":integer1, "Silver":integer2, "Bronze": integer3, "Total": integer4} return(new_dict) summer_olympics_medals = read_file_countries("summer_olympics_countries.csv")this is the output:
Output:{'AFG': {'Gold': 0, 'Silver': 0, 'Bronze': 2, 'Total': 2}, 'ALB': {'Gold': 0, 'Silver': 0, 'Bronze': 0, 'Total': 0}, 'ALG': {'Gold': 5, 'Silver': 4, 'Bronze': 8, 'Total': 17}, 'ASA': {'Gold': 0, 'Silver': 0, 'Bronze': 0, 'Total': 0}, 'AND': {'Gold': 0, 'Silver': 0, 'Bronze': 0, 'Total': 0}, 'ANG': {'Gold': 0, 'Silver': 0, 'Bronze': 0, 'Total': 0}, 'ARG': {'Gold': 21, 'Silver': 25, 'Bronze': 28, 'Total': 74}, 'ARM': {'Gold': 2, 'Silver': 5, 'Bronze': 9, 'Total': 16}, 'ARU': {'Gold': 0, 'Silver': 0, 'Bronze': 0, 'Total': 0}, 'AUS': {'Gold': 146, 'Silver': 167, 'Bronze': 191, 'Total': 504},....
second func was making a dict that the keys are the country name shortcut and values are full name:noc_dict = {} def read_file_noc(file): with open("noc_countries.csv", "r") as my_csv: next(my_csv) for line in my_csv: line = line.replace('\n', '') line = line.split(',') noc_dict[line[0]] = line[1] return noc_dict
Output:{'AFG': 'Afghanistan', 'ALB': 'Albania', 'ALG': 'Algeria', 'ASA': 'American Samoa', 'AND': 'Andorra', 'ANG': 'Angola', 'ANT': 'Antigua', 'ARG': 'Argentina', 'ARM': 'Armenia', 'ARU': 'Aruba', 'AUS': 'Australia',}
the third func was changing the shortcut name in the first dict to the full country name using the two function above:def switch_to_full_name(dict1,dict2): comp_dict ={} if isinstance(dict1, dict) and isinstance(dict2, dict): comb_dict = {} for k in dict1 : if k in dict2: comb_dict [dict1 [k]] = dict2 [k] return comb_dict else: return "Input must be a dictionary." medals_fix = switch_to_full_name(noc_dict, summer_olympics_medals)output:
{'Afghanistan': {'Gold': 0, 'Silver': 0, 'Bronze': 2, 'Total': 2}, 'Albania': {'Gold': 0, 'Silver': 0, 'Bronze': 0, 'Total': 0}, 'Algeria': {'Gold': 5, 'Silver': 4, 'Bronze': 8, 'Total': 17}, 'American Samoa': {'Gold': 0, 'Silver': 0, 'Bronze': 0, 'Total': 0}, 'Andorra': {'Gold': 0, 'Silver': 0, 'Bronze': 0, 'Total': 0}, 'Angola': {'Gold': 0, 'Silver': 0, 'Bronze': 0, 'Total': 0}, 'Argentina': {'Gold': 21, 'Silver': 25, 'Bronze': 28, 'Total': 74}, 'Armenia': {'Gold': 2, 'Silver': 5, 'Bronze': 9, 'Total': 16}, 'Aruba': {'Gold': 0, 'Silver': 0, 'Bronze': 0, 'Total': 0}, 'Australia': {'Gold': 146, 'Silver': 167, 'Bronze': 191, 'Total': 504},...the last function which is the one that I keep getting false at is a function that sort the countries by medals adding their rank next to them:
def rank_countries(dict1): if isinstance(dict1, dict): for i in dict1: if isinstance(dict1[i], dict): new_list = [(k, v['Total']) for k, v in dict1.items()] new_list=sorted(new_list, key= lambda tup: tup[1], reverse= True) for rank in range (len (new_list)) : new_list [rank] = (rank+1,) + new_list [rank] return new_list else: return 'Input must be a nested dictionary.' else: return 'Input must be a nested dictionary.'now here is the problem, the expected output ends like that:
Output:(190, 'South Sudan', 0), (191, 'Swaziland', 0), (192, 'Turkmenistan', 0), (193, 'Vanuatu', 0), (194, 'Yemen', 0)]
and this is my output:Output:(190, 'Swaziland', 0), (191, 'Turkmenistan', 0), (192, 'Vanuatu', 0), (193, 'British Virgin Islands', 0), (194, 'Yemen', 0)]
I keep getting British Virgin Islands in the V countries instead of the B countries.I think that the reason is in the second function that return dict of shortcut and full name, because the shortcut of British Virgin Islands in the file is IVB, but as I said at the start.. I have no clue how to fix that. appreciate any help