我有一个大小列表< N 我希望用一个值将其填充到N大小。
当然,我可以使用以下内容,但我觉得应该有一些我错过的东西:
>>> N = 5
>>> a = [1]
>>> map(lambda x, y: y if x is None else x, a, ['']*N)
[1, '', '', '', '']
答案 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的padnone
和take
食谱修改)
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包括padnone
和take
,如@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 )]