使用字典理解从文件中读取
Reading from file using dict comprehensions
我经常需要从(通常是制表符分隔值)文件中读取数据并将它们转换为字典。通常我只需要将其中一列映射到另一列,但也可能会对值进行一些处理(例如去除空格)。我一直在尝试想出一个 dict 理解模式来做到这一点,但我将 运行 放入一些小麻烦中,这些小麻烦使我无法始终如一地以最简洁和易于理解的方式实施它。而且我觉得可能有更好的方法。
下面是我尝试过的(一些)方法,以及它们出错的地方:
with open(path) as f:
return {line.split("\t")[0].strip(): line.split("\t")[1].strip()
for line in f}
这是我经常使用的。它允许我就地修改键和值,并且可以在任何列上工作(例如,如果我想将值从第三列映射到第一列)。明显的问题是 line.split()
部分重复。有没有办法将 line.split("\t")
绑定到临时变量,或者将值直接解压到变量中?
with open(path) as f:
return dict(line.split("\t")[:2] for line in f)
我刚想到这个。它非常适用于这种简单情况(仅将第一列映射到第二列,不进行任何处理),但不能推广到其他情况。很难进行额外的处理,并且使用的列必须相邻。也不是严格的dict comprehension,不能转化为一个,因为它使用的是slice。
d = dict()
for line in open(path):
d.update({line.split("\t")[0]: line.split("\t")[1]})
return d
当然,我可以先创建字典,然后更新每一行。但是现在我必须分别创建 dict 和 return 它,代码重复仍然存在。
我也玩过嵌套的字典理解并将拆分的行解包为变量,但是 运行 遇到了不同的问题。
你可以通过在你的 f
:
周围放一些东西来做到这一点
def tabsplit(file_object):
for line in file_object:
yield line.split("\t")
然后:
with open(path) as f:
return {left.strip(): right.strip() for left, right, *rest in tabsplit(f)}
不确定为什么首先创建字典不起作用
result = {}
with open(path) as f:
for line in f:
columns = line.split("\t")
key = columns[0] # first item is the key right?
result[key] = columns[1]
我经常需要从(通常是制表符分隔值)文件中读取数据并将它们转换为字典。通常我只需要将其中一列映射到另一列,但也可能会对值进行一些处理(例如去除空格)。我一直在尝试想出一个 dict 理解模式来做到这一点,但我将 运行 放入一些小麻烦中,这些小麻烦使我无法始终如一地以最简洁和易于理解的方式实施它。而且我觉得可能有更好的方法。
下面是我尝试过的(一些)方法,以及它们出错的地方:
with open(path) as f: return {line.split("\t")[0].strip(): line.split("\t")[1].strip() for line in f}
这是我经常使用的。它允许我就地修改键和值,并且可以在任何列上工作(例如,如果我想将值从第三列映射到第一列)。明显的问题是 line.split()
部分重复。有没有办法将 line.split("\t")
绑定到临时变量,或者将值直接解压到变量中?
with open(path) as f: return dict(line.split("\t")[:2] for line in f)
我刚想到这个。它非常适用于这种简单情况(仅将第一列映射到第二列,不进行任何处理),但不能推广到其他情况。很难进行额外的处理,并且使用的列必须相邻。也不是严格的dict comprehension,不能转化为一个,因为它使用的是slice。
d = dict() for line in open(path): d.update({line.split("\t")[0]: line.split("\t")[1]}) return d
当然,我可以先创建字典,然后更新每一行。但是现在我必须分别创建 dict 和 return 它,代码重复仍然存在。
我也玩过嵌套的字典理解并将拆分的行解包为变量,但是 运行 遇到了不同的问题。
你可以通过在你的 f
:
def tabsplit(file_object):
for line in file_object:
yield line.split("\t")
然后:
with open(path) as f:
return {left.strip(): right.strip() for left, right, *rest in tabsplit(f)}
不确定为什么首先创建字典不起作用
result = {}
with open(path) as f:
for line in f:
columns = line.split("\t")
key = columns[0] # first item is the key right?
result[key] = columns[1]