如何使用Python将列表填充为0

62

我想从另一个列表中获取固定长度的列表,例如:

a = ['a','b','c']
b = [0,0,0,0,0,0,0,0,0,0]

我想获得这样的列表:['a','b','c',0,0,0,0,0,0,0]。换句话说,如果len(a) < len(b),我想要从列表b中填充值到列表a的长度,类似于str.ljust所做的。

这是我的代码:

a=['a','b','c']
b = [0 for i in range(5)]
b = [a[i] for i in b if a[i] else i]

print a

但是它显示错误:

  File "c.py", line 7
    b = [a[i] for i in b if a[i] else i]
                                    ^
SyntaxError: invalid syntax

我该怎么办?


1
b = [0 for i in range(10)] a=['a','b','c'] b = [0 for i in range(10)] c = [a[i] if i < len(a) else b[i] for i in xrange(len(b)) ] c ['a', 'b', 'c', 0, 0, 0, 0, 0, 0, 0]
- Bandiera
10个回答

121

为什么不直接这样做:

a = a + [0]*(maxLen - len(a))

10
这对于不可变对象(如0)效果很好,但对于可变对象则行不通。 [0 for i in range(maxlen-len(a))] 可适用于不论是不可变还是可变对象。 - S.Lott
3
原帖要求零值,这不应该是问题。而且你的示例仅适用于可变对象,如果你确保为每个i创建一个新对象,就可以避免这个问题。如果你只是将0替换为另一个变量,你会遇到同样的问题。 - Achim
1
@S.Lott的答案对于可变对象对我来说似乎完全有效。 - Roman

30

使用 itertools 的 repeat 函数。

>>> from itertools import repeat
>>> a + list(repeat(0, 6))
['a', 'b', 'c', 0, 0, 0, 0, 0, 0]

2
不能使用可变对象。尝试使用 lst = list(repeat([0], 10)),然后执行 lst[0][0] = 1,最后打印 lst - naktinis
@naktinis 很容易适应(比排名第一的答案更容易),使用列表推导式:a + [MyMutable() for repeat(0, 6)] - jpmc26

9
为什么不直接
c = (a + b)[:len(b)]

4
更明确地说,这个解决方案将b的第一个元素替换为a的所有元素,而不管ab中的值是什么:
a + b[len(a):]

这也适用于以下内容:
>>> a = ['a', ['b'], None, False]
>>> b = [0, 1, 2, 3, 4, 5]
>>> a + b[len(a):]
['a', ['b'], None, False, 4, 5] 

如果您不想结果超过b的长度:
>>> a = ['a', ['b'], None, False]
>>> b = [0, 1, 2]
>>> (a + b[len(a):])[:len(b)]
['a', ['b'], None]

2
a+[0]*(len(b) - len(a))

['a', 'b', 'c', 0, 0, 0, 0, 0, 0, 0]

2
LIST_LENGTH = 10
a = ['a','b','c']

while len(a) < LIST_LENGTH:
    a.append(0)

1
这非常简单明了。没有列表推导式或切片符号需要理解它。 - DevPlayer

1
如果您想要使用可变值(例如 dict)来填充,可以这样做:
map(lambda x: {}, [None] * n)

其中n是数组中元素的数量。

>>> map(lambda x: {}, [None] * 14)
[{}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}]
>>> l = map(lambda x: {}, [None] * 14)
>>> l[0]
{}
>>> l[0]['bar'] = 'foo'
>>> l
[{'bar': 'foo'}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}]

如果没有使用 lambda 进行填充,每个元素都会变成 {'bar': 'foo'}


1
[{} for x in range(14)] 实现了相同的功能。 - Lynn

0

另一种解决方案:

a = ['a', 'b', 'c']
maxlen = 10
result = [(0 if i+1 > len(a) else a[i])  for i in range(maxlen)]

我更喜欢其他一些解决方案。


0
a = ['a', 'b', 'c']
b = [0, 0, 0, 0, 0, 0]
a.extend(b[len(a):])
# a is now ['a', 'b', 'c', 0, 0, 0]

-1

你不能只是这样做吗:

a = ['a','b','c']
b = [0,0,0,0,0,0,0,0]

c = a + b #= ['a','b','c',0,0,0,0,0,0,0]

拼接列表时,固定长度不是问题。 - recursive
4
你的示例结果应为 ['a', 'b', 'c', 0, 0, 0, 0],以符合原帖作者的要求。 - dansalmo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接