我正在读取一个文件并解压缩每一行:
for line in filter(fh):
a, b, c, d = line.split()
但是,行可能比我想要解压缩的变量具有更多或更少的列。在少数情况下,我想将None
分配给悬空变量,如果还有更多,我想忽略它们。这样做的惯用方法是什么?我正在使用python 2.7。
答案 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)