【发布时间】:2016-02-05 16:16:18
【问题描述】:
我经常需要从(通常是制表符分隔值)文件中读取数据并将它们转换为字典。通常我只需要将其中一列映射到另一列,但也可能对值进行一些处理(例如剥离空白)。我一直在尝试提出一个 dict 理解模式来做到这一点,但我一直遇到一些小麻烦,这使我无法始终如一地以最简洁和易于理解的方式实施它。而且我感觉可能有更好的方法。
以下是我尝试过的(一些)方法,以及它们出错的地方:
打开(路径)为 f: 返回 {line.split("\t")[0].strip(): line.split("\t")[1].strip() 对于 f} 中的行
这是我经常使用的。它允许我修改键和值,并且可以在任何列上工作(例如,如果我想将值从第三列映射到第一列)。明显的问题是line.split() 部分的重复。有没有办法将line.split("\t") 绑定到一个临时变量,或者将值直接解包到变量中?
打开(路径)为 f: return dict(line.split("\t")[:2] for line in f)
我刚想出这个。它适用于这个简单的情况(只是将第一列映射到第二列,没有任何处理),但不能推广到其他情况。很难进行额外的处理,并且使用的列必须相邻。它也不是一个严格的dict理解,因为它使用切片,所以不能变成一个。
d = 字典() 对于打开(路径)中的行: d.update({line.split("\t")[0]: line.split("\t")[1]}) 返回 d
当然,我可以先创建字典,然后更新每一行。但是现在我要创建dict并单独返回,代码重复仍然存在。
我也玩过嵌套的dict理解并将分割的行解压缩为变量,但遇到了不同的问题。
【问题讨论】:
-
您正在尝试优化可能受 I/O 限制的内容,因此只要创建字典尽可能快或使用最少的代码,您所做的任何事情都不会产生很大的影响.
标签: python dictionary dictionary-comprehension