Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/279.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 将列表分配到变量的更好方法_Python - Fatal编程技术网

Python 将列表分配到变量的更好方法

Python 将列表分配到变量的更好方法,python,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])

正在用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的知识就这样

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

到目前为止,我不喜欢这些答案,因为它们把所有的东西都放在一个表达式中。您希望减少代码中的冗余,而不是一次做太多

如果行中的所有项目都是整数,则将它们一起转换,这样您就不必每次都写入
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]

我可能会使用带有分隔符的
csv
模块(尽管如果您“确定”格式总是超级简单、单行、无字符串等,这可能会有些过分)。与低级字符串处理一样,csv阅读器将为您提供字符串,您需要对每个字符串调用
int
(使用列表理解或
map
call)来获取整数。其他技巧包括使用
with
语句打开文件,以确保它不会导致“文件描述符泄漏”(在当前的CPython版本中不是必不可少的,但对于可移植性和未来的验证来说,这是一个极好的主意)


但我质疑是否需要30个单独的名称来表示30个相关的值。例如,为什么不创建一个
collections.NamedTuple
类型和适当命名的字段,并初始化其实例,然后为字段使用限定名称,即一个好的名称空间?还记得Python Zen中的最后一个koan吗(在解释器提示下导入此代码):“名称空间是一个非常好的想法——让我们做更多的事情吧!”。。。barenames有其(有限的;-)位置,但表示几十个相关值并不是一个问题——相反,这种情况“呼喊”了“让我们做更多这些”方法(即,添加一个适当的名称空间,对相关字段进行分组——这是一种更好的数据组织方式)。

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

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

keys = ("done", "rema", "succ" ... )
somedict = dict(zip(keys, [int(v) for v in values]))
那就行了。:-)看起来也比30行要好:-)

编辑:我认为现在有dict comphrensions,所以看起来可能更好!:-)
编辑第2部分:另外,对于keys集合,您希望将其分解为多文件行

再次编辑:修复错误部分:)

谢谢您的回答。下面是总结-

  • 格伦的答案是分块处理这个问题。i、 e.
    done、rema、succ=starf[0:2]
  • Leoluk的方法更加简短,充分利用了python强大的dict理解能力
  • 亚历克斯的回答更倾向于设计。我喜欢这种方法。我知道应该按照Alex建议的方式来做,但是需要进行大量的代码重新分解。现在不是做这件事的好时机
  • 汤森-与2相同

  • 我采用了莱奥卢克的方法。我不确定这意味着什么速度?我不知道列表/听写理解是否会影响执行速度。但是现在它大大减少了我代码的大小。我会在需要的时候进行优化:)顺便说一句——“早熟优化是万恶之源”…

    如果有30项,我会说这不那么优雅:PI就像新的和改进的版本……现在更优雅了:)很感谢提到Python的禅宗(…而且,与讨论无关(对不起)但是,简而言之,你的Python是我最喜欢的一本书:3)我认为它行不通。。。若你们在一个理解列表中有两个for,那个么它就是两个集合的carthesian产品。啊!妈的,我确实搞砸了。回到修复你有没有打字错误?你从statf开始,然后是starf。@Geoffrey,是的!有个打字错误。更正了…既然你已经采用了莱奥卢克的方法,那么遵循宣布他为格斗冠军的堆栈溢出习惯将是一个好主意。程序很简单:大声说出他的名字,然后点击他答案旁边的勾号。当刻度线变绿时,利奥卢克的胜利也将向世界其他地区宣告。