如何使用字符串键和元组值从文件读取到dict?

时间:2013-07-18 14:52:53

标签: python python-3.x dictionary tuples iterable-unpacking

对于作业,我正在创建一个程序,从文件中检索有关奥运国家及其奖牌数的信息。

我的一个功能是以这种格式列出一个列表:

Country,Games,Gold,Silver,Bronze
AFG,13,0,0,2
ALG,15,5,2,8
ARG,40,18,24,28
ARM,10,1,2,9
ANZ,2,3,4,5

该功能需要通过此列表,并存储到一个字典中,国家名称作为键,其余四个条目作为元组。

到目前为止,这是我正在使用的内容:

def medals(string):
    '''takes a file, and gathers up the country codes and their medal counts
    storing them into a dictionary'''

    #creates an empty dictionary
    medalDict = {}
    #creates an empty tuple
    medalCount = ()
    #These following two lines remove the column headings
    with open(string) as fin:
        next(fin)

        for eachline in fin:
            code, medal_count = eachline.strip().split(',',1)
            medalDict[code] = medal_count

    return medalDict

现在,意图是使条目看起来像这样

{'AFG': (13, 0, 0, 2)}

相反,我正在

{'AFG': '13,0,0,2'}

它看起来像是存储为字符串,而不是元组。是否与

有关
medalDict[code] = medal_count

代码行?我不太确定如何将它转换为整齐的元组的单独整数值。

3 个答案:

答案 0 :(得分:2)

您将整个字符串'13,0,0,2'存储为值,因此

medalDict[code] = medal_count

应替换为:

medalDict[code] = tuple(medal_count.split(','))

你原来的想法是正确的,这一行是唯一的例外。改变的是现在它将'13,0,0,2'分成列表['13','0','0','2']并将其转换为元组。

您也可以这样做将内部的字符串转换为整数:

medalDict[code] = tuple([int(ele) for ele in medal_count.split(',')])

但请确保您的medal_count仅包含整数。

答案 1 :(得分:1)

这一行:

code, medal_count = eachline.strip().split(',',1)

... split strip时空eachline ped 1','时间code,然后将生成的两个字符串存储到{ {1}}和medal_count ...是的,medal_count包含一个字符串。

您可以采用以下两种方式之一:

  1. 沿着以下行添加一行:

    split_counts = tuple(medal_count.split(','))
    

    ...然后在代码中使用split_counts

  2. (在Python 3中)将上面的行更改为

    code, *medal_count = eachline.strip().split(',')
    

    ...它使用了Extended iterable unpacking(并会给你一个列表,所以如果需要一个元组,它就需要转换)。

答案 2 :(得分:0)

你的问题似乎是这样的:

split(',',1)
# should be
split(',')

因为split(..., 1)只进行了1次拆分并且split(...)尽可能地拆分。

所以你应该能够做到这一点:

    for eachline in fin:
        code, *medal_count = eachline.strip().split(',')
        medalDict[code] = medal_count