【问题标题】:creating two dictionaries from one .tsv using comprehensions使用推导从一个 .tsv 创建两个字典
【发布时间】:2015-06-05 02:09:41
【问题描述】:

我有一个由一个键和两个值组成的 .tsv。我想创建两个字典,一个从键映射到文件中每一行的第一个值,另一个从键映射到第二个值。我可以这样做:

v1Dict = {key: v1 for (key,v1,v2) in (line.split("\t") for line in (open (myinputfile)))}
v2Dict = {key: v2 for (key,v1,v2) in (line.split("\t") for line in (open (myinputfile)))}

但这显然效率低下,因为它两次读取/解析整个文件。

或者,我可以这样做:

v1Dict = {}
v2Dict = {}
for (key,v1,v2) in (line.split("\t") for line in (open (myinputfile))):
    v1Dict[key]=v1
    v2Dict[key]=v2

这是“最好”的方法吗?

【问题讨论】:

  • 恐怕你需要扩展它。您需要确保文件已关闭。并且文件系统 io 开销应该大于当前的计算开销。

标签: python python-2.7 dictionary list-comprehension


【解决方案1】:

You can use with:

v1Dict = {}
v2Dict = {}
with open(myinputfile) as f:
    for(key, v1, v2) in [line.split("\t") for line in f]:
        v1Dict[key] = v1
        v2Dict[key] = v2

或者,你可以把它变成一个单行:

f = open(myinputfile);v1Dict,v2Dict=[{key: v1 for (key,v1,v2) in (line.split("\t") for line in f)}, {key: v2 for (key,v1,v2) in (line.split("\t") for line in f)}]

查看here 了解有关使用with 的更多信息。

【讨论】:

  • 如果你使用with,我想你想用f替换(open(myinputfile))with 使用 in 让我有什么收获?
  • @PurpleVermont with 更pythonic,它打开文件一次,最后自动关闭。
  • 我认为in 在这样的理解中使用它时也会这样做。
  • 您的列表理解也会打开一次,但您没有在最后关闭文件,这可能会导致不必要的问题。您问哪种方法最好,从内存使用和“pythonicness”的角度来看,可以说with 更好。
  • 不,你不能用推导式创建两个字典,你只能通过访问open来创建一个对象,因为如果你尝试创建两个,它每次opens文件
猜你喜欢
  • 2017-04-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-01
  • 1970-01-01
  • 2020-06-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多