将列表分配到var的更好方法

时间:2010-08-31 20:43:16

标签: python

用Python编写代码。有一段代码,想知道它是否可以更优雅地完成......

# Statistics format is - done|remaining|200's|404's|size
statf = open(STATS_FILE, 'r').read()
starf = statf.strip().split('|')
done  = int(starf[0])
rema  = int(starf[1])
succ  = int(starf[2])
fails = int(starf[3])
size  = int(starf[4])
...

这种情况继续下去。我想知道在将行拆分成列表之后是​​否有更好的方法将每个列表分配到var中。我有近30行为vars分配索引值。只是想了解更多关于Python的信息......

5 个答案:

答案 0 :(得分:6)

done, rema, succ, fails, size, ... = [int(x) for x in starf]

更好:

labels = ("done", "rema", "succ", "fails", "size")

data = dict(zip(labels, [int(x) for x in starf]))

print data['done']

答案 1 :(得分:5)

到目前为止,我不喜欢的答案是,他们将所有内容都放在一个表达式中。您希望减少代码中的冗余,而不必立即执行太多操作。

如果该行上的所有项目都是整数,那么将它们全部转换,这样您就不必每次都写int(...)

starf = [int(i) for i in starf]

如果只有某些项目是整数 - 可能有些是字符串或浮点数 - 那么你可以转换那些:

for i in 0,1,2,3,4:
    starf[i] = int(starf[i]))

以块为单位分配很有用;如果你有很多项目 - 你说你有30个 - 你可以把它分开:

done, rema, succ = starf[0:2]
fails, size = starf[3:4]

答案 2 :(得分:4)

我可能会将csv模块与|的分隔符一起使用(如果你确定“格式总是超级简单,单行,不字符串等)。就像你的低级字符串处理一样,csv阅读器会给你字符串,你需要在每个字符串上调用int(使用列表理解或map调用)来获得整数。其他提示包括使用with语句打开您的文件,以确保它不会导致“文件描述符泄露”(在当前的CPython版本中不是必不可少的,但是对于可移植性和面向未来的一个很好的想法)。 / p>

但我质疑是否需要30个单独的名字代表30个相关值。例如,为什么不使用具有适当命名字段的collections.NamedTuple类型,并初始化其实例,然后对字段使用限定名称,即一个漂亮的命名空间?记住Python的Zen中的最后一个koan(解释器提示符下的import this):“命名空间是一个很棒的主意 - 让我们做更多的事情!”......裸名有他们(有限的;-)的地方,但是代表几十个相关的值不是一个 - 相反,这种情况“大声呼喊”“让我们做更多的那些”方法(即,添加一个适当的命名空间分组相关字段 - a更好的组织数据的方法)。

答案 3 :(得分:0)

使用Python dict可能是最优雅的选择。

如果您将密钥放在列表中:

keys = ("done", "rema", "succ" ... )
somedict = dict(zip(keys, [int(v) for v in values]))

那会有用。 :-)看起来也好于30行: - )

编辑:我认为现在有dict comphrensions,所以看起来也可能更好! :-)
编辑第2部分:此外,对于密钥集合,您希望将其分解为多个行。
再次编辑:修复了错误的部分:)

答案 4 :(得分:0)

感谢所有答案。所以这是摘要 -

  1. 格伦的回答是用块来处理这个问题。即done, rema, succ = starf[0:2]等。
  2. Leoluk的方法更简短&甜蜜地利用了蟒蛇极其强大的词汇理解力。
  3. Alex的回答更多是面向设计的。喜欢这种方法。我知道它应该像Alex建议的那样完成,但需要为此进行大量的代码重新分解。现在不是一个好时机。
  4. townsean - 与2相同
  5. 我采用了Leoluk的方法。我不确定速度的含义是什么?我不知道List / Dict理解是否会影响执行速度。但它现在可以减少我的代码的大小。我会在需要的时候进行优化:)顺便说一句 - “预成熟优化是所有邪恶的根源”......