繁体   English   中英

Python从文件创建字典

[英]Python create dictionary from file

我有此Python代码未完全读取我想要的内容。 对于性能最差的汽车,福特应该是数量最多的汽车,但我不断得到雪佛兰ssr的结果有什么帮助吗?

这是我正在使用的文件的格式:

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

这是我的代码:

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)

除了代码的错误提示(将其粘贴到问题中可能是一个错误)之外,它只有一个真正的问题:

car_tuple = (line[0])

这不会构成元组,而只是将line[0]分配给car_tuple 要使其成为元组,您需要添加逗号:

car_tuple = (line[0], )

但是,这不会改变您稍后尝试拆开元组时遇到的问题,因此您应该仅使用一个空字符串作为第二个元组项:

car_tuple = (line[0], '')

然后,您的代码将得出正确的结果:

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

话虽如此,您可以通过使用其他一些Python技巧来简化所有操作。 这是我的8行解决方案,外加注释,以便您了解发生了什么:

# 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)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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