尝试分析带有字典标题行的2列(color 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
似乎应该有更好的方法来处理trys和exception。
按要求摘录文件:
color Observed
green 15
gold 20
green 35
答案 0 :(得分: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
会更好。
像这样使用:
from collections import defaultdict
color_dict = defaultdict(int)
这样,在操作之前,您不必检查key
是否存在。所以,您可以这样做:
color_dict[item[0]] += int(item[1])
答案 1 :(得分:2)
在这种情况下,我会使用defaultdict
。因为,当第一次遇到每个密钥时,它不在映射中;所以会自动创建一个条目。
from collections import defaultdict
color_dict = defaultdict(int)
for item in filelist:
color_dict[item[0]] += int(item[1])