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

时间:2013-12-10 17:38:24

标签: python iterable-unpacking

我正在读取一个文件并解压缩每一行:

for line in filter(fh):
  a, b, c, d = line.split()

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

5 个答案:

答案 0 :(得分:12)

使用None修补列表的长度,填充。

def fixLength(lst, length):
    return (lst + [None] * length)[:length]

答案 1 :(得分:5)

在python 3中,你可以使用这个

a, b, c, d, *_unused_ = line.split() + [None]*4

修改

对于大字符串,我建议使用maxsplit - split的参数(此参数也适用于py2.7):

a, b, c, d, *_unused_ = line.split(None, 4) + [None]*4

为什么5?否则,第4个元素将包含整行的剩余部分。

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

答案 2 :(得分:5)

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

但是,考虑到你想要(1)填充None和(2)忽略额外的变量,代码很简单:

a,b,c,d = (line.split() + [None]*4)[:4]

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

对于任意迭代,您可以这样做:

import itertools

def padslice(seq,n):
    return itertools.islice(itertools.chain(seq,itertools.repeat(None)), n)

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

答案 3 :(得分:0)

在Python 3中,您可以像这样使用itertools.zip_longest

from itertools import zip_longest

max_params = 4

lst = [1, 2, 3, 4]
a, b, c, d = next(zip(*zip_longest(lst, range(max_params))))
print(f'{a}, {b}, {c}, {d}') # 1, 2, 3, 4

lst = [1, 2, 3]
a, b, c, d = next(zip(*zip_longest(lst, range(max_params))))
print(f'{a}, {b}, {c}, {d}') # 1, 2, 3, None

对于Python 2.x,您可以遵循此answer

答案 4 :(得分:-1)

这样的东西适用于任何可迭代/迭代器。如果您总是要传递一个列表,那么您可以删除islice部分。

from itertools import islice
def solve(seq, n):
    lis = list(islice(seq, n))
    return lis + [None]*(n - len(lis))
... 
>>> a, b, c, d = solve(range(2), 4)
>>> a, b, c, d
(0, 1, None, None)
>>> a, b, c, d = solve('qwe', 4)
>>> a, b, c, d
('q', 'w', 'e', None)
>>> a, b, c, d = solve(iter([1, 2, 3, 4, 5]), 4)
>>> a, b, c, d
(1, 2, 3, 4)