1

尝试分析具有字典标题行的 2 列(颜色 number_of_occurances).tsv 文件。尝试以最通用的方式跳过标题行(假设这是通过要求第二列是 int 类型)。以下是我想出的最好的,但似乎必须有更好的:

filelist = []
color_dict = {}
with open('file1.tsv') as F:
    filelist = [line.strip('\n').split('\t') for line in F]
for item in filelist:
    try: #attempt to add values to existing dictionary entry
        x = color_dict[item[0]]
        x += int(item[1])
        color_dict[item[0]] = x
    except: #if color has not been observed yet (KeyError), or if non-convertable string(ValueError) create new entry
        try:
            color_dict[item[0]] = int(item[1])
        except(ValueError): #if item[1] can't convert to int
            pass

似乎应该有更好的方法来处理尝试和异常。

请求文件摘录:

color Observed
green 15
gold 20
green 35

4

2 回答 2

4

你不能通过[1:]像这样切片列表来跳过列表中的第一个元素:

filelist = [line.strip('\n').split('\t') for line in F][1:]

现在,fileList将根本不包含第一行的元素,即标题行。

或者,正如@StevenRumbalski 在评论中指出的那样,您可以在列表理解next(F, None)之前简单地做,以避免在第一个元素之后复制您的列表:

with open('file1.tsv') as F:
    next(F, None)
    filelist = [line.strip('\n').split('\t') for line in F]

另外,如果你在defaultdict这里使用a会更好。

像这样使用它:

from collections import defaultdict
color_dict = defaultdict(int)

这样,您就不必在对其key进行操作之前检查 , 是否存在。因此,您可以简单地执行以下操作:

color_dict[item[0]] += int(item[1])
于 2013-02-14T20:52:55.333 回答
2

我会defaultdict在这种情况下使用。因为,当第一次遇到每个键时,它还没有在映射中;因此会自动创建一个条目。

 from collections import defaultdict
 color_dict = defaultdict(int)
 for item in filelist:
       color_dict[item[0]] += int(item[1])
于 2013-02-14T20:56:39.580 回答