更好的方式将列表赋值给变量

4 投票
5 回答
677 浏览
提问于 2025-04-16 03:33

我在用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])
...

事情是这样的。我想知道在把一行代码分割成列表之后,有没有更好的方法把每个列表的值赋给变量。我现在有将近30行代码在把索引值赋给变量。我只是想多了解一下Python,仅此而已...

5 个回答

4

我可能会用 csv 模块,设置分隔符为 |(不过如果你很确定格式会一直很简单,比如单行、没有字符串等,这样做可能有点多余)。就像你处理字符串时,csv 读取器会给你字符串,你需要对每个字符串调用 int(可以用列表推导式或者 map 函数)来把它们转换成整数。还有个小建议是,使用 with 语句来打开文件,这样可以避免出现“文件描述符泄漏”的问题(在当前的 CPython 版本中不是必需的,但为了兼容性和未来的使用,使用它是个好主意)。

不过我觉得用 30 个不同的变量名来表示 30 个相关的值是不是有点多余。比如,可以创建一个 collections.NamedTuple 类型,给字段起个合适的名字,然后初始化一个实例,这样就可以用带有前缀的名字来访问字段,也就是有了一个很好的命名空间。记得 Python 的 Zen 里最后一句话吗(在解释器里输入 import this 可以看到):“命名空间真是个好主意——我们应该多用这些!”……虽然变量名有它的用处,但用来表示几十个相关值就不太合适了——这种情况更适合用“多用这些”的方法(也就是添加一个合适的命名空间,把相关字段归在一起——这样组织数据会更好)。

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]
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']

撰写回答