138

我有一个大小 < N的列表,我想用一个值将它填充到大小 N。

当然,我可以使用类似以下的东西,但我觉得应该有一些我错过的东西:

>>> N = 5
>>> a = [1]
>>> map(lambda x, y: y if x is None else x, a, ['']*N)
[1, '', '', '', '']
4

14 回答 14

220
a += [''] * (N - len(a))

或者如果你不想a就地改变

new_a = a + [''] * (N - len(a))

您始终可以创建列表的子类并随意调用该方法

class MyList(list):
    def ljust(self, n, fillvalue=''):
        return self + [fillvalue] * (n - len(self))

a = MyList(['1'])
b = a.ljust(5, '')
于 2010-08-09T09:43:12.150 回答
39

我认为这种方法更加直观和 Pythonic。

a = (a + N * [''])[:N]
于 2016-10-07T18:18:55.573 回答
30

没有内置功能。但是您可以为您的任务(或任何东西:p)编写内置插件。

(根据 itertoolpadnonetake食谱修改)

from itertools import chain, repeat, islice

def pad_infinite(iterable, padding=None):
   return chain(iterable, repeat(padding))

def pad(iterable, size, padding=None):
   return islice(pad_infinite(iterable, padding), size)

用法:

>>> list(pad([1,2,3], 7, ''))
[1, 2, 3, '', '', '', '']
于 2010-08-09T10:09:24.780 回答
9

more-itertools是一个包含padded此类问题的特殊工具的库:

import more_itertools as mit

list(mit.padded(a, "", N))
# [1, '', '', '', '']

或者,more_itertools还实现了 Python itertools 配方,包括padnone@kennytmtake提到的,因此不必重新实现它们:

list(mit.take(N, mit.padnone(a)))
# [1, None, None, None, None]

如果您希望替换默认None填充,请使用列表推导:

["" if i is None else i for i in mit.take(N, mit.padnone(a))]
# [1, '', '', '', '']
于 2017-08-22T18:38:50.730 回答
7

gnibbler 的答案更好,但如果你需要一个内置函数,你可以使用itertools.izip_longestzip_longest在 Py3k 中):

itertools.izip_longest( xrange( N ), list )

这将返回一个( i, list[ i ] )填充为 None 的元组列表。如果您需要摆脱柜台,请执行以下操作:

map( itertools.itemgetter( 1 ), itertools.izip_longest( xrange( N ), list ) )
于 2010-08-09T10:04:20.560 回答
5

您也可以使用没有任何内置插件的简单生成器。但我不会填充列表,而是让应用程序逻辑处理一个空列表。

无论如何,没有构建的迭代器

def pad(iterable, padding='.', length=7):
    '''
    >>> iterable = [1,2,3]
    >>> list(pad(iterable))
    [1, 2, 3, '.', '.', '.', '.']
    '''
    for count, i in enumerate(iterable):
        yield i
    while count < length - 1:
        count += 1
        yield padding

if __name__ == '__main__':
    import doctest
    doctest.testmod()
于 2010-08-09T10:32:29.353 回答
4

如果你想用 None 而不是 '' 填充,map() 可以完成这项工作:

>>> map(None,[1,2,3],xrange(7))

[(1, 0), (2, 1), (3, 2), (None, 3), (None, 4), (None, 5), (None, 6)]

>>> zip(*map(None,[1,2,3],xrange(7)))[0]

(1, 2, 3, None, None, None, None)
于 2011-01-03T21:34:45.990 回答
3
extra_length = desired_length - len(l)
l.extend(value for _ in range(extra_length))

这避免了任何额外的分配,这与任何依赖于创建和附加列表的解决方案不同[value] * extra_length。“extend”方法首先调用迭代器,并在从迭代器中填充之前__length_hint__将分配扩展这么多。l

于 2019-04-17T20:16:17.087 回答
3

离开 kennytm:

def pad(l, size, padding):
    return l + [padding] * abs((len(l)-size))

>>> l = [1,2,3]
>>> pad(l, 7, 0)
[1, 2, 3, 0, 0, 0, 0]
于 2016-03-23T23:59:15.737 回答
3

您可以使用* 可迭代的拆包运算符

N = 5
a = [1]

pad_value = ''
pad_size = N - len(a)

final_list = [*a, *[pad_value] * pad_size]
print(final_list)

输出:

[1, '', '', '', '']
于 2019-09-26T08:01:16.260 回答
2

使用迭代器并利用默认参数next

i = iter(a)
a = [next(i, '') for _ in range(N)]

简短说明:

无论哪种方式,我们都想生产N物品。因此for _ in range(N). 那么元素应该是尽可能多a的,剩下的就可以了''。使用迭代器,a我们抓取所有可能的元素,当我们得到 时StopIteration,将返回默认值'',即.

于 2020-12-03T09:15:46.813 回答
1

添加到现有列表中np.repeat

import numpy as np
a + list(np.repeat([''], (N - len(a))))
于 2021-01-06T01:07:33.133 回答
1

在元素列表之前添加填充

a[:0] += [''] * (N - len(a))

在元素列表之后添加填充

a += [''] * (N - len(a))
于 2022-01-07T11:58:33.357 回答
-2

一种用空元素填充列表的 Pythonic 方法是使用列表推导。

        my_list = [1,2]
        desired_len = 3
        # Ensure that the length of my list is 3 elements
        [my_list.extend(['']) for _ in range(desired_len - len(my_list))]
        [my_list.pop() for _ in range(len(my_list)-desired_len )]
于 2021-01-16T01:59:21.757 回答