2

对于一项任务,我正在创建一个程序,该程序从文件中检索有关奥林匹克国家及其奖牌数的信息。

我的一个函数通过这种格式的列表:

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

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

4

3 回答 3

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 仅包含整数。

于 2013-07-18T15:41:48.197 回答
1

这一行:

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

... 正在split处理空格,时间,on strip,然后将生成的两个字符串存储到and ... 所以是的,包含一个字符串。eachline1','codemedal_countmedal_count

您可以通过以下两种方式之一处理:

  1. 沿以下行添加一行:

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

    ...然后split_counts在代码中从那里使用,或者

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

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

    ...它利用了扩展的可迭代解包(并且会给你一个列表,所以如果需要一个元组,它就需要被转换)。

于 2013-07-18T15:09:47.797 回答
0

你的问题似乎是这样的:

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

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

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

    for eachline in fin:
        code, *medal_count = eachline.strip().split(',')
        medalDict[code] = medal_count
于 2013-07-18T15:06:19.937 回答