Problem Statement This exercise includes 3 bonuses and 8 hints. I'd like you to write a function called csv_columns that accepts a file object and returns a dictionary mapping CSV headers to column data for each header. If our CSV file contains this data: h1,h2 1,2 3,4 Then our function will work like this: >>> csv_columns(open('my_file.csv')) {'h1': ['1', '3'], 'h2': ['2', '4']} Your csv_columns function shouldn't close the file given to it. Note that the CSV data may have commas inside the cells as well, so a simple split-by-commas won't work. Bonus 1 For the first bonus, I'd like you to make sure the dictionary returned from csv_columns has keys in the same order as the columns that were in our CSV file. ✔️ Depending on your version of Python this may be easy or it may require digging through the standard library. Bonus 2 For the second bonus, you should allow an optional headers argument to our function. ✔️ >>> csv_columns(open('my_file.csv'), headers=['header1', 'header2']) {'header1': ['h1', '1', '3'], 'header2': ['h2', '2', '4']} If no headers are provided, the first row is used as the headers just as before. Bonus 3 For the third bonus, make csv_columns work with CSV files that have different numbers of columns in each row. ✔️ Missing values should default to None, but you should also accept an optional missing argument to allow a different value to be used. So, if our CSV file contains this data: h1,h2 1,2 3,4 5 Then it will fill in the missing value at the end of the second column with the given missing value: >>> csv_columns(open('my_file.csv'), missing='0') {'h1': ['1', '3', '5'], 'h2': ['2', '4', '0']} >>> csv_columns(open('my_file.csv')) {'h1': ['1', '3', '5'], 'h2': ['2', '4', None]} Hints Reading CSV files in Python https://pymotw.com/3/csv/index.html Getting the header for each data cell https://treyhunner.com/2016/04/how-to-loop-with-indexes-in-python/#zip Setting default values in a dictionary https://docs.quantifiedcode.com/python-anti-patterns/correctness/not_using_setdefault_to_initialize_a_dictionary.html Transposing all of the CSV rows at once https://stackoverflow.com/a/49103300/2633215 Reading CSV files by their header names https://stackoverflow.com/a/29432995/2633215 Bonus 1: A hint for Python 3.5 and below https://pymotw.com/3/collections/ordereddict.html Bonus 3: a helper for looping over different length iterables https://docs.python.org/3/library/itertools.html#itertools.zip_longest Bonus 3: an even simpler way to solve bonus 3 https://stackoverflow.com/a/34777914/2633215