一些内置的用于在python中填充列表

时间:2010-08-09 09:30:23

标签: python list list-manipulation

我有一个大小列表< N 我希望用一个值将其填充到N大小。

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

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

13 个答案:

答案 0 :(得分:124)

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, '')

答案 1 :(得分:21)

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

(从itertool的padnonetake食谱修改)

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, '', '', '', '']

答案 2 :(得分:18)

我认为这种方法更具视觉和pythonic。

a = (a + N * [''])[:N]

答案 3 :(得分:5)

gnibbler的答案更好,但如果你需要内置,你可以使用itertools.izip_longest(Py3k中的zip_longest):

itertools.izip_longest( xrange( N ), list )

将返回填充为无的元组( i, list[ i ] )列表。如果您需要摆脱计数器,请执行以下操作:

map( itertools.itemgetter( 1 ), itertools.izip_longest( xrange( N ), list ) )

答案 4 :(得分:4)

你也可以使用一个没有任何构建的简单生成器。 但我不会填充列表,但让应用程序逻辑处理一个空列表。

无论如何,没有buildins的迭代器

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()

答案 5 :(得分: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)

答案 6 :(得分:3)

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

class DataModels
{
    public List<string> ReturnDataFromTableX()
    {
        return _DataEntities.<TABLE_NAME>.Select(x => x.<COLUMN_NAME>).ToList();
    }
}

或者,import more_itertools as mit list(mit.padded(a, "", N)) # [1, '', '', '', ''] 也会实现@ itertools recipes包括padnonetake,如@kennytm所提到的,因此无需重新实现:

more_itertools

如果您希望替换默认的list(mit.take(N, mit.padnone(a))) # [1, None, None, None, None] 填充,请使用列表解析:

None

答案 7 :(得分:1)

离开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]

答案 8 :(得分:1)

您可以使用* iterable unpacking operator

N = 5
a = [1]

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

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

输出:

[1, '', '', '', '']

答案 9 :(得分:1)

使用迭代器并利用next default 参数:

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

简短说明:

无论哪种方式,我们都想生产N件商品。因此,for _ in range(N)。然后,元素应该尽可能多地来自a和其余''。在a上使用迭代器,我们将获取所有可能的元素,当我们获得StopIteration时,将返回 default ,即''

答案 10 :(得分:1)

使用 np.repeat 添加到现有列表:

import numpy as np
a + list(np.repeat([''], (N - len(a))))

答案 11 :(得分:0)

extra_length = desired_length - len(l)
l.extend(value for _ in range(extra_length))

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

答案 12 :(得分:-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 )]