习惯于解压缩最大大小n的可变长度列表的方法

pyt*_*hor 10 python iterable-unpacking

我正在读取文件并解压缩每行如下:

for line in filter(fh):
  a, b, c, d = line.split()
Run Code Online (Sandbox Code Playgroud)

但是,行可能比我想要解压缩的变量具有更多或更少的列.在少数情况下,我想分配None悬空变量,在有更多变量的情况下,我想忽略它们.这样做的惯用方法是什么?我正在使用python 2.7.

Hyp*_*eus 12

修复列表的长度,填充None.

def fixLength(lst, length):
    return (lst + [None] * length)[:length]
Run Code Online (Sandbox Code Playgroud)


kof*_*ein 5

在python 3中,您可以使用它

a, b, c, d, *_unused_ = line.split() + [None]*4
Run Code Online (Sandbox Code Playgroud)

编辑

对于大字符串,我建议使用maxsplit-argument进行拆分(此参数也适用于py2.7):

a, b, c, d, *_unused_ = line.split(None, 4) + [None]*4
Run Code Online (Sandbox Code Playgroud)

为什么5?否则,第四个元素将包含整个线的剩余部分.

Edit2它是4 ...它在4次分裂后停止,而不是4个元素


Mar*_*cin 5

首先,想想你为什么要这样做.

但是,鉴于您希望(1)填充None和(2)忽略额外的变量,代码很简单:

a,b,c,d = (line.split() + [None]*4)[:4]
Run Code Online (Sandbox Code Playgroud)

显然,幻数必须与变量的数量相同.这将扩展你所拥有的幻数,然后修剪回到那个长度.

对于任意迭代,您可以执行以下操作:

import itertools

def padslice(seq,n):
    return itertools.islice(itertools.chain(seq,itertools.repeat(None)), n)
Run Code Online (Sandbox Code Playgroud)

这是与itertools相同的pad-and-slice.