简体   繁体   中英

Python create dictionary from file

I have this Python code that is not reading what I want it to read exactly. For the worst cars, Ford should be the one with the max number of worst cars but I keep getting the result of Chevy ssr any help?

This is the format of the file I'm working with:

1899 Horsey Horseless
1909 Ford Model T
1911 Overland OctoAuto
1913 Scripps-Booth Bi-Autogo
1920 Briggs and Stratton Flyer
1933 Fuller Dymaxion
1934 Chrysler/Desoto Airflow
1949 Crosley Hotshot
1956 Renault Dauphine
1957 King Midget Model III

And this is my code:

import string

def car_dictionary(file_obj):
    car_dict = {}
    for line in file_obj:
        line =line.strip()
        line =line.split()
        manufacturer = line[1]
    if len(line) ==3:
        car_tuple = (line[0],''.join(line[2:]))
    else:
        car_tuple = (line[0])
    if manufacturer in car_dict:
        car_dict[manufacturer].append(car_tuple)
    else:
        car_dict[manufacturer] = [car_tuple]

return car_dict

def max_worst_cars(car_dict):
    worst_manufacturer =("")
    worst_count = 0
    for a,b in car_dict.items():
        if len(b) > worst_count:
            worst_manufacturer = a
            worst_count = len(b)
            print("Worse Manufacturer is: ", worst_manufacturer)
            print("Cars: ")
    for y, m in car_dict[worst_manufacturer]:
        print(y,m)

file_obj=open("cars.txt", "r")
car_dict = car_dictionary(file_obj)
file_obj.close()
max_worst_cars(car_dict)

Apart from the incorrect indendation of your code (which was probably a mistake when you pasted it into the question), there is only one real problem with it:

car_tuple = (line[0])

This won't make a tuple, but will just assign line[0] to car_tuple . To make it a tuple, you need to include a comma:

car_tuple = (line[0], )

However, this won't change the problem you will have later when you try to unpack the tuples, so you should just use an empty string as the second tuple item:

car_tuple = (line[0], '')

Then, your code results in the correct result:

Worse Manufacturer is:  Ford
Cars:
1909
1958 Edsel
1971 Pinto
1995 Explorer
2000 Excursion

That being said, you can do this all a bit simpler by using a few more Python tricks. Here is my 8-line solution, plus comments so you understand what's going on:

# We’re going to use `defaultdict` to handle the whole “when there is
# already an element in the dictionay, append to the list, otherwise
# create a new entry with a single list item” thing. `defaultdict` just
# allows us to append without having to manually initialize new keys.
from collections import defaultdict

# Files should always be opened with the `with` statement, to ensure
# that they are closed correctly afterwards. Since we’re reading, we
# don’t need to specify the open mode ('r' is the default).
with open('cars.txt') as f:
    # We initialize our dictionary as a defaultdict, where each item
    # is automatically initialized with an empty list.
    cars = defaultdict(list)

    for line in f:
        # We put strip and split in a single line. Since we always
        # get at least two values from your file format, we can just
        # unpack the values directly. We collect additional unpacked
        # values (so index 2 or above) in a list called `rest` (the
        # star symbol does that). That list may be empty, or not.
        year, manufacturer, *rest = line.strip().split()

        # We just append (because it’s a defaultdict, we don’t need
        # to initialize it) to the list of the manufacturer a tuple
        # with the unpacked year, and the joined values of the rest.
        cars[manufacturer].append((year, ' '.join(rest)))

# Now that we collected our cars dictionary, we want to find the
# manufacturer that has the highest number of cars. Since `cars` maps
# the key manufacturer to the a list of cars (car tuples actually), we
# essentially want to get the dictionary item with the maximum length
# in the item value. We use the built-in `max` function with a custom
# key function for this.
# `cars.items()` returns a sequence of key/value tuples of the
# dictionary. We want to get the maximum value of those key/value
# tuples, and as a metric for “maximum value” we use a function that
# takes this tuple `(manufacturer, listOfCarTuples)` and returns the
# length of that `listOfCarTuples`. So in the key function, `x` is that
# tuple, so `x[1]` is the list of car tuples. So the length of that list
# is the metric of the current dictionary item which we want to get the
# maximum from.
worst = max(cars.items(), key=lambda x: len(x[1]))

# `worst` is now `(manufacturer, listOfCarTuples)` where
# `len(listOfCarTuples)` has the maximum value.
print(worst)

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM