7.2. Dictionary Exercises#

7.2.1. Exercise 1#

Load people.tsv into a dictionary. Prompt user for filename

Hide code cell source
# filename = input('What is the name of the file? ')
filename = 'people.tsv'
header = None
data_array = []

with open(filename, 'r') as fp:
    for line in fp:
        if header is None:
            header = line.strip().split('\t')
            continue

        data_array.append(dict(zip(header, line.strip().split('\t'))))

from pprint import pprint
pprint(data_array)
[{'account': 'QVJP6465242365388',
  'country': 'Nepal',
  'email': 'xdunn@hotmail.com',
  'first_name': 'Michael',
  'last_name': 'Weaver'},
 {'account': 'FVQZ0955529767455',
  'country': 'Kazakhstan',
  'email': 'iedwards@yahoo.com',
  'first_name': 'Jackson',
  'last_name': 'Owens'},
 {'account': 'QFIM0905182880347',
  'country': 'Mauritius',
  'email': 'arogers@smith.com',
  'first_name': 'Patrick',
  'last_name': 'Gilmore'},
 {'account': 'YWOT0997131632248',
  'country': 'New Zealand',
  'email': 'plewis@chavez.com',
  'first_name': 'Jeffrey',
  'last_name': 'Perez'},
 {'account': 'QAAE9838291982555',
  'country': 'Yemen',
  'email': 'fred92@yahoo.com',
  'first_name': 'James',
  'last_name': 'Thomas'},
 {'account': 'PCNE8127696280157',
  'country': 'Jordan',
  'email': 'mmiller@lynch.com',
  'first_name': 'Greg',
  'last_name': 'Nelson'},
 {'account': 'BCEN3299883381338',
  'country': 'Palau',
  'email': 'steven49@gmail.com',
  'first_name': 'Joshua',
  'last_name': 'White'},
 {'account': 'XPTQ7837014557677',
  'country': 'Argentina',
  'email': 'amanda23@hotmail.com',
  'first_name': 'Todd',
  'last_name': 'Francis'},
 {'account': 'TRLQ6559557081716',
  'country': 'Marshall Islands',
  'email': 'jackduke@hotmail.com',
  'first_name': 'Stephen',
  'last_name': 'Shaw'},
 {'account': 'OHOV7518558201999',
  'country': 'Albania',
  'email': 'rhodesnicholas@hotmail.com',
  'first_name': 'Mariah',
  'last_name': 'Armstrong'},
 {'account': 'MCQU7347833033110',
  'country': 'Kyrgyz Republic',
  'email': 'smithashlee@yahoo.com',
  'first_name': 'Anthony',
  'last_name': 'Boyle'},
 {'account': 'PPHE5533473251751',
  'country': 'Turkmenistan',
  'email': 'ubriggs@hill.info',
  'first_name': 'Patrick',
  'last_name': 'Cuevas'},
 {'account': 'JCDK1943355298609',
  'country': 'Fiji',
  'email': 'brownclarence@gonzalez-moore.com',
  'first_name': 'Gerald',
  'last_name': 'Reyes'},
 {'account': 'NERZ5502558659614',
  'country': 'Costa Rica',
  'email': 'teresa30@carpenter-warner.com',
  'first_name': 'Christopher',
  'last_name': 'Calderon'},
 {'account': 'DLDV5789894914403',
  'country': 'Martinique',
  'email': 'leekatherine@williams.com',
  'first_name': 'Shane',
  'last_name': 'Weiss'},
 {'account': 'GZZF6936998445532',
  'country': 'Singapore',
  'email': 'chasewatkins@perez-phillips.com',
  'first_name': 'Crystal',
  'last_name': 'Conley'},
 {'account': 'ECGK2823955143629',
  'country': 'Mayotte',
  'email': 'hsherman@gmail.com',
  'first_name': 'Jeffrey',
  'last_name': 'Nelson'},
 {'account': 'QOVO4275314052899',
  'country': 'Costa Rica',
  'email': 'martinezdaniel@hotmail.com',
  'first_name': 'Brianna',
  'last_name': 'Johnson'},
 {'account': 'UKRT1119626365017',
  'country': 'Guadeloupe',
  'email': 'justinfischer@gmail.com',
  'first_name': 'Brandon',
  'last_name': 'Werner'},
 {'account': 'UNPV3347450330173',
  'country': 'Bahamas',
  'email': 'cindy08@gmail.com',
  'first_name': 'Brianna',
  'last_name': 'Bennett'},
 {'account': 'GJZT6825738428111',
  'country': 'Azerbaijan',
  'email': 'carolharrington@fleming.org',
  'first_name': 'Austin',
  'last_name': 'Fletcher'},
 {'account': 'JOQE2648899771737',
  'country': 'Saint Helena',
  'email': 'lopezcarl@johnson.com',
  'first_name': 'Patrick',
  'last_name': 'Lewis'},
 {'account': 'MNXY3262955868027',
  'country': 'Hong Kong',
  'email': 'michael74@yahoo.com',
  'first_name': 'Joseph',
  'last_name': 'Smith'},
 {'account': 'YHXF7256577475630',
  'country': 'Turkey',
  'email': 'gonzalezrobert@hotmail.com',
  'first_name': 'Sharon',
  'last_name': 'Sullivan'},
 {'account': 'MUVI3570791852556',
  'country': 'Swaziland',
  'email': 'dawnjohnson@gmail.com',
  'first_name': 'Krystal',
  'last_name': 'Wilson'},
 {'account': 'UKCP6739617302102',
  'country': 'Holy See (Vatican City State)',
  'email': 'watersryan@gmail.com',
  'first_name': 'Diana',
  'last_name': 'Schmidt'},
 {'account': 'WDAT4146843903498',
  'country': 'Norfolk Island',
  'email': 'byoung@gmail.com',
  'first_name': 'Sean',
  'last_name': 'Huff'},
 {'account': 'SVMU4403517448078',
  'country': 'Kenya',
  'email': 'vhanson@yahoo.com',
  'first_name': 'Robin',
  'last_name': 'Nguyen'},
 {'account': 'ZNUY4071301663622',
  'country': 'Togo',
  'email': 'bfletcher@yahoo.com',
  'first_name': 'Robyn',
  'last_name': 'Russell'},
 {'account': 'GPFA8271551275648',
  'country': 'San Marino',
  'email': 'colleengarrison@hotmail.com',
  'first_name': 'Tiffany',
  'last_name': 'Smith'},
 {'account': 'MKWY4848668895426',
  'country': 'Romania',
  'email': 'catherine23@gmail.com',
  'first_name': 'Lori',
  'last_name': 'Smith'},
 {'account': 'QHIW7412514205367',
  'country': 'Algeria',
  'email': 'xmurphy@yahoo.com',
  'first_name': 'Sabrina',
  'last_name': 'Keith'},
 {'account': 'QAAO4666689281736',
  'country': 'Slovakia (Slovak Republic)',
  'email': 'aaronrichard@middleton.net',
  'first_name': 'Miguel',
  'last_name': 'Johnson'},
 {'account': 'LRPR8694143910883',
  'country': 'Somalia',
  'email': 'jesse93@best.com',
  'first_name': 'Dustin',
  'last_name': 'Barron'},
 {'account': 'UWFU1921951273393',
  'country': 'Turkmenistan',
  'email': 'johnperez@johnson.com',
  'first_name': 'Michael',
  'last_name': 'Robinson'},
 {'account': 'JQHS4274771257925',
  'country': 'Croatia',
  'email': 'jessica62@yahoo.com',
  'first_name': 'Robert',
  'last_name': 'Nguyen'},
 {'account': 'RSLD0426398604312',
  'country': 'Jamaica',
  'email': 'jennifer87@gmail.com',
  'first_name': 'Brandon',
  'last_name': 'Abbott'},
 {'account': 'UYHI6964741005832',
  'country': 'Montserrat',
  'email': 'morenolindsay@bass.org',
  'first_name': 'Bruce',
  'last_name': 'Oneill'},
 {'account': 'ZKTE5908966955533',
  'country': 'Heard Island and McDonald Islands',
  'email': 'robertdavis@hotmail.com',
  'first_name': 'Linda',
  'last_name': 'Nash'},
 {'account': 'HHHP3471562002758',
  'country': 'Niger',
  'email': 'melanie81@rogers.com',
  'first_name': 'Kathleen',
  'last_name': 'Cameron'},
 {'account': 'UWLV6407825245995',
  'country': 'Saint Vincent and the Grenadines',
  'email': 'clineerin@hotmail.com',
  'first_name': 'Wesley',
  'last_name': 'Wilkinson'},
 {'account': 'JRBN0811785293731',
  'country': 'Antigua and Barbuda',
  'email': 'terri95@hotmail.com',
  'first_name': 'Debbie',
  'last_name': 'Wallace'},
 {'account': 'VDWY7565964041116',
  'country': 'Mexico',
  'email': 'danielle65@yahoo.com',
  'first_name': 'Kayla',
  'last_name': 'Woodward'},
 {'account': 'DNRB2101855092009',
  'country': 'Singapore',
  'email': 'sjackson@yahoo.com',
  'first_name': 'Stephanie',
  'last_name': 'Bennett'},
 {'account': 'IILE1765776198023',
  'country': 'Botswana',
  'email': 'douglas63@yahoo.com',
  'first_name': 'Caleb',
  'last_name': 'Jenkins'},
 {'account': 'ZJUF2687631787282',
  'country': 'Guinea',
  'email': 'woodardlindsey@yahoo.com',
  'first_name': 'Valerie',
  'last_name': 'Edwards'},
 {'account': 'DHMT4208071148508',
  'country': 'Chile',
  'email': 'suebrown@yahoo.com',
  'first_name': 'Mary',
  'last_name': 'Anderson'},
 {'account': 'UBRR8524342666714',
  'country': 'Mayotte',
  'email': 'swhite@yahoo.com',
  'first_name': 'Angela',
  'last_name': 'Ray'},
 {'account': 'OGPU6537909247863',
  'country': 'Macedonia',
  'email': 'martinkimberly@lopez.com',
  'first_name': 'Haley',
  'last_name': 'Edwards'},
 {'account': 'AHYX6128839695452',
  'country': 'Ukraine',
  'email': 'jessica11@hotmail.com',
  'first_name': 'Charles',
  'last_name': 'Clark'},
 {'account': 'VUPW6891906300822',
  'country': 'Saint Martin',
  'email': 'hsmith@baker.com',
  'first_name': 'Lisa',
  'last_name': 'Hill'},
 {'account': 'PKFW4841194501766',
  'country': 'Germany',
  'email': 'fklein@yahoo.com',
  'first_name': 'Jonathan',
  'last_name': 'Carpenter'},
 {'account': 'BNYD8693045932496',
  'country': 'Lesotho',
  'email': 'ryan32@skinner.com',
  'first_name': 'Latoya',
  'last_name': 'Griffith'},
 {'account': 'FQJA6381776349463',
  'country': 'Nepal',
  'email': 'tmurphy@flores.biz',
  'first_name': 'Kim',
  'last_name': 'Blair'},
 {'account': 'KCNI2464381879411',
  'country': 'Latvia',
  'email': 'mary64@ray.org',
  'first_name': 'Mary',
  'last_name': 'Salazar'},
 {'account': 'BIGY3006735396533',
  'country': 'Central African Republic',
  'email': 'jennajoseph@yahoo.com',
  'first_name': 'Kenneth',
  'last_name': 'Krueger'},
 {'account': 'CNJX1222752295544',
  'country': 'Peru',
  'email': 'watsonsamuel@gmail.com',
  'first_name': 'Phillip',
  'last_name': 'Burke'},
 {'account': 'ZROP5229895490397',
  'country': 'Spain',
  'email': 'xvelasquez@hughes.com',
  'first_name': 'Erica',
  'last_name': 'Juarez'},
 {'account': 'NXKK2792812848629',
  'country': 'Seychelles',
  'email': 'april99@gmail.com',
  'first_name': 'Jason',
  'last_name': 'Watkins'},
 {'account': 'DPLN5056382218296',
  'country': 'Faroe Islands',
  'email': 'kfletcher@yahoo.com',
  'first_name': 'Lee',
  'last_name': 'Carter'},
 {'account': 'KAOL9792684486009',
  'country': 'Tokelau',
  'email': 'xchurch@hotmail.com',
  'first_name': 'Randy',
  'last_name': 'Huang'},
 {'account': 'WRXW4627191899235',
  'country': 'Cocos (Keeling) Islands',
  'email': 'megan24@stewart.net',
  'first_name': 'Kristina',
  'last_name': 'Owen'},
 {'account': 'OMOK4767172062189',
  'country': 'Burundi',
  'email': 'sydneycollins@hunter.com',
  'first_name': 'Beth',
  'last_name': 'Turner'},
 {'account': 'KRKF7344951038740',
  'country': 'Timor-Leste',
  'email': 'robertbowen@chavez-ortega.com',
  'first_name': 'Michael',
  'last_name': 'Aguirre'},
 {'account': 'SAAA4141150617330',
  'country': 'Montserrat',
  'email': 'christiandanielle@yahoo.com',
  'first_name': 'Elizabeth',
  'last_name': 'Wilson'},
 {'account': 'XNWQ1072087896797',
  'country': 'Norway',
  'email': 'kdavidson@gordon.com',
  'first_name': 'Teresa',
  'last_name': 'Hardy'},
 {'account': 'FTHM1005169617995',
  'country': 'Sierra Leone',
  'email': 'bennettwanda@vega-guerra.net',
  'first_name': 'David',
  'last_name': 'Stewart'},
 {'account': 'OSSM9070924947595',
  'country': 'French Polynesia',
  'email': 'mark00@hotmail.com',
  'first_name': 'Heather',
  'last_name': 'Moore'},
 {'account': 'CFQJ4204773901237',
  'country': 'French Guiana',
  'email': 'schaefernatalie@hotmail.com',
  'first_name': 'Melissa',
  'last_name': 'Grant'},
 {'account': 'MGFG2793756668287',
  'country': 'Cape Verde',
  'email': 'moralesmartin@rodgers.com',
  'first_name': 'Jennifer',
  'last_name': 'Thompson'},
 {'account': 'IGXK5881682171566',
  'country': 'Barbados',
  'email': 'dprince@hotmail.com',
  'first_name': 'Raymond',
  'last_name': 'Anderson'},
 {'account': 'QYBW6359021109484',
  'country': 'Andorra',
  'email': 'cparks@valdez-hudson.com',
  'first_name': 'Angela',
  'last_name': 'Ramsey'},
 {'account': 'UTSI0776569247505',
  'country': 'Montserrat',
  'email': 'martinezrichard@yahoo.com',
  'first_name': 'Betty',
  'last_name': 'Gonzales'},
 {'account': 'LSDI9463735752680',
  'country': 'Egypt',
  'email': 'kpena@yahoo.com',
  'first_name': 'Thomas',
  'last_name': 'Castaneda'},
 {'account': 'ISYY1401931979959',
  'country': 'Malaysia',
  'email': 'julie68@gmail.com',
  'first_name': 'Jonathan',
  'last_name': 'Todd'},
 {'account': 'HNOA0376843856035',
  'country': 'Zimbabwe',
  'email': 'lukebradford@hotmail.com',
  'first_name': 'Stacey',
  'last_name': 'Garcia'},
 {'account': 'EEVV8325881104553',
  'country': 'Portugal',
  'email': 'ystewart@yahoo.com',
  'first_name': 'Judy',
  'last_name': 'Figueroa'},
 {'account': 'QXGZ3111246190069',
  'country': 'Paraguay',
  'email': 'cory33@king-shaw.net',
  'first_name': 'Ashley',
  'last_name': 'Castillo'},
 {'account': 'ACQR2846533122117',
  'country': 'Central African Republic',
  'email': 'zcalhoun@gmail.com',
  'first_name': 'Zachary',
  'last_name': 'Flores'},
 {'account': 'ZAZD8310339637467',
  'country': 'Palau',
  'email': 'michaelhall@hotmail.com',
  'first_name': 'Erica',
  'last_name': 'Allen'},
 {'account': 'ARWK1547324119222',
  'country': 'Micronesia',
  'email': 'kristentaylor@yahoo.com',
  'first_name': 'Savannah',
  'last_name': 'Potts'},
 {'account': 'OMQX4840913072589',
  'country': 'Armenia',
  'email': 'stephen63@yahoo.com',
  'first_name': 'Zachary',
  'last_name': 'Wheeler'},
 {'account': 'OCFV4659464275270',
  'country': 'Bahrain',
  'email': 'bryanmartin@gmail.com',
  'first_name': 'Timothy',
  'last_name': 'Thomas'},
 {'account': 'DTRB4720098955341',
  'country': 'Guatemala',
  'email': 'kristinavelasquez@gmail.com',
  'first_name': 'Ann',
  'last_name': 'Mcknight'},
 {'account': 'YYHM5758234683389',
  'country': 'Saint Vincent and the Grenadines',
  'email': 'denise01@burns.org',
  'first_name': 'Ruth',
  'last_name': 'Thompson'},
 {'account': 'AHBN3151680654826',
  'country': 'Kazakhstan',
  'email': 'beancody@jones.com',
  'first_name': 'Daniel',
  'last_name': 'Levy'},
 {'account': 'FGBC0366153271398',
  'country': 'Germany',
  'email': 'ubradley@yahoo.com',
  'first_name': 'Paul',
  'last_name': 'Hubbard'},
 {'account': 'MHTE8867005510944',
  'country': 'Western Sahara',
  'email': 'anthony75@yahoo.com',
  'first_name': 'Jason',
  'last_name': 'Jones'},
 {'account': 'IYOD4325345823013',
  'country': 'Togo',
  'email': 'antonio52@gmail.com',
  'first_name': 'Margaret',
  'last_name': 'Garcia'},
 {'account': 'NZFX8257739892619',
  'country': 'Guam',
  'email': 'johnlewis@hotmail.com',
  'first_name': 'Jeremy',
  'last_name': 'Peters'},
 {'account': 'MWRB2515761996641',
  'country': 'Kuwait',
  'email': 'nmoore@hotmail.com',
  'first_name': 'Mark',
  'last_name': 'Stone'},
 {'account': 'CURJ9953745256871',
  'country': 'Eritrea',
  'email': 'nchurch@yahoo.com',
  'first_name': 'Darius',
  'last_name': 'Edwards'},
 {'account': 'ATOT8581137487723',
  'country': 'Czech Republic',
  'email': 'piercejenna@gmail.com',
  'first_name': 'Tracy',
  'last_name': 'Lawson'},
 {'account': 'RQGA0882784089265',
  'country': 'Maldives',
  'email': 'ddavidson@hotmail.com',
  'first_name': 'Christina',
  'last_name': 'Cooper'},
 {'account': 'EOPA8088866975598',
  'country': 'Armenia',
  'email': 'ndelacruz@yahoo.com',
  'first_name': 'Megan',
  'last_name': 'Harris'},
 {'account': 'JCUN9597199552039',
  'country': 'Benin',
  'email': 'jenniferadkins@griffin.biz',
  'first_name': 'Timothy',
  'last_name': 'Jones'},
 {'account': 'IZYL3351829981461',
  'country': 'Fiji',
  'email': 'evansmiguel@yahoo.com',
  'first_name': 'Tracie',
  'last_name': 'Burch'},
 {'account': 'JDIH2349154465371',
  'country': 'Iceland',
  'email': 'kenneththompson@baxter.com',
  'first_name': 'Jason',
  'last_name': 'Chung'},
 {'account': 'VRZP1447516193511',
  'country': 'Macedonia',
  'email': 'bcurtis@hotmail.com',
  'first_name': 'Samantha',
  'last_name': 'Melton'},
 {'account': 'QKAF2254397516681',
  'country': 'Serbia',
  'email': 'phillipssean@hotmail.com',
  'first_name': 'Michael',
  'last_name': 'Hansen'}]

7.2.2. Exercise 2#

Write a function to convert month number to month name. First use a list and then a dictionary

Hide code cell source
def convert_to_month_list(month):

    months = [
        '',
        'January',
        'February',
        'March',
        'April',
        'May',
        'June',
        'July',
        'August',
        'September',
        'October',
        'November',
        'December',
    ]

    return months[month]

print(convert_to_month_list(3))

def convert_to_month_dict(month):

    months = {
        1: 'January',
        2: 'February',
        3: 'March',
        4: 'April',
        5: 'May',
        6: 'June',
        7: 'July',
        8: 'August',
        9: 'September',
        10: 'October',
        11: 'November',
        12: 'December',
    }


    return months[month]

print(convert_to_month_list(3))
March
March

7.2.3. Exercise 3#

Convert a text message to numbers using the following number scheme

0  space
1  ., ?, !
2  ABC
3  DEF
4  GHI
5  JKL
6  MNO
7  PQRS
8  TUV
9  WXYZ
Hide code cell source
def convert_message_to_numbers(message):

    lookup = {
        0: ' ',
        1: '.,?!',
        2: 'ABC',
        3: 'DEF',
        4: 'GHI',
        5: 'JKL',
        6: 'MNO',
        7: 'PQRS',
        8: 'TUV',
        9: 'WXYZ'
    }


    lookup_map = {}

    for key, value in lookup.items():
        for ele in value:
            lookup_map[ele] = key


    # order is important!!!!
    lookup_map = {ele: key for key, value in lookup.items() for ele in value }

    # order incorrect
    # lookup_map = {ele: key for ele in value  for key, value in lookup.items()}


    # lookup = (
    #     (0, ' '),
    #     (1, '.,?!'),
    #     (2, 'ABC'),
    #     (3, 'DEF'),
    #     (4, 'GHI'),
    #     (5, 'JKL'),
    #     (6, 'MNO'),
    #     (7, 'PQRS'),
    #     (8, 'TUV'),
    #     (9, 'WXYZ'),
    # )


    # lookup_map = {}

    # for key, value in lookup:
    #     for ele in value:
    #         lookup_map[ele] = key


    numbers = ''
    for char in message:
        numbers += str(lookup_map[char.upper()])



    lookup_map = {ele: str(key)*idx for key, value in lookup.items() for idx, ele in enumerate(value, 1)  }

    print(lookup_map)

    numbers = ''
    for char in message:
        numbers += lookup_map[char.upper()]


    return numbers


print(convert_message_to_numbers('Hello, World!'))
{' ': '0', '.': '1', ',': '11', '?': '111', '!': '1111', 'A': '2', 'B': '22', 'C': '222', 'D': '3', 'E': '33', 'F': '333', 'G': '4', 'H': '44', 'I': '444', 'J': '5', 'K': '55', 'L': '555', 'M': '6', 'N': '66', 'O': '666', 'P': '7', 'Q': '77', 'R': '777', 'S': '7777', 'T': '8', 'U': '88', 'V': '888', 'W': '9', 'X': '99', 'Y': '999', 'Z': '9999'}
4433555555666110966677755531111

7.2.4. Exercise 4#

Write a function that uses enumerate to print the index and value from range. Use vary the enumerate start index

Hide code cell source
def test_enumerate(range_value):

    for index, value in enumerate(range(range_value), 1):
        print(index, value)

test_enumerate(10)
1 0
2 1
3 2
4 3
5 4
6 5
7 6
8 7
9 8
10 9

7.2.5. Exercise 5#

Simulate two dice. Print the total, theoretical/expected probability, and simulated probability input: the number of simulations https://socratic.org/questions/what-is-the-expected-value-of-the-sum-of-two-rolls-of-a-six-sided-die

# Total     Simulated Percent     Expected Percent 

# 2                      2.76                 2.78
# 3                      5.57                 5.56
# 4                      8.34                 8.33
# 5                      11.1                11.11
# 6                     13.83                13.89
# 7                     16.68                16.67
# 8                      13.9                13.89
# 9                      11.1                11.11
# 10                     8.36                 8.33
# 11                     5.57                 5.56
# 12                     2.79                 2.78
Hide code cell source
def simulate_two_dice(no_simulation):
    import random
    theoretical_probabilities = [
        0,
        0,
        1 / 36,
        2 / 36,
        3 / 36,
        4 / 36,
        5 / 36,
        6 / 36,
        5 / 36,
        4 / 36,
        3 / 36,
        2 / 36,
        1 / 36,
    ]

    two_dice = {}

    for no in range(no_simulation):
        dice1 = random.randint(1, 6)
        dice2 = random.randint(1, 6)

        total = dice1 + dice2
        if total not in two_dice:
            two_dice[total] = 0

        two_dice[total] += 1

    simulated_probability = [0, 0]

    for number in range(2, 13):
        simulated_probability.append(two_dice[number] / no_simulation)

    column1 = 'Total'
    column2 = 'Simulated Percent'
    column3 = 'Expected Percent'

    print(
        column1.ljust(6),
        column2.rjust(20),
        column3.rjust(20),
        '\n'
    )
    for number in range(2, 13):
        sp = round(simulated_probability[number] * 100, 2)
        tp = round(theoretical_probabilities[number] * 100, 2)
        print(
            str(number).ljust(6),
            str(sp).rjust(20),
            str(tp).rjust(20),
        )

simulate_two_dice(1000000)
Total     Simulated Percent     Expected Percent 

2                      2.77                 2.78
3                      5.53                 5.56
4                      8.36                 8.33
5                     11.09                11.11
6                     13.86                13.89
7                     16.73                16.67
8                     13.85                13.89
9                     11.15                11.11
10                     8.34                 8.33
11                     5.55                 5.56
12                     2.78                 2.78