new*_*ver 91 python list list-manipulation
我有一个大小< N的列表,我想用一个值填充大小为N.
当然,我可以使用类似下面的东西,但我觉得应该有一些我错过的东西:
>>> N = 5
>>> a = [1]
>>> map(lambda x, y: y if x is None else x, a, ['']*N)
[1, '', '', '', '']
Run Code Online (Sandbox Code Playgroud)
Joh*_*ooy 141
a += [''] * (N - len(a))
Run Code Online (Sandbox Code Playgroud)
或者如果你不想改变a
它
new_a = a + [''] * (N - len(a))
Run Code Online (Sandbox Code Playgroud)
您始终可以创建列表的子类并随意调用该方法
class MyList(list):
def ljust(self, n, fillvalue=''):
return self + [fillvalue] * (n - len(self))
a = MyList(['1'])
b = a.ljust(5, '')
Run Code Online (Sandbox Code Playgroud)
Nun*_*dré 23
我认为这种方法更具视觉和pythonic.
a = (a + N * [''])[:N]
Run Code Online (Sandbox Code Playgroud)
ken*_*ytm 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)
Run Code Online (Sandbox Code Playgroud)
用法:
>>> list(pad([1,2,3], 7, ''))
[1, 2, 3, '', '', '', '']
Run Code Online (Sandbox Code Playgroud)
more-itertools
是一个包含padded
解决此类问题的特殊工具的库:
import more_itertools as mit
list(mit.padded(a, "", N))
# [1, '', '', '', '']
Run Code Online (Sandbox Code Playgroud)
另外,more_itertools
还实现了Python的itertools食谱,包括padnone
和take
由@kennytm提到的,这样他们就不必重新实现:
list(mit.take(N, mit.padnone(a)))
# [1, None, None, None, None]
Run Code Online (Sandbox Code Playgroud)
如果您希望替换默认None
填充,请使用列表理解:
["" if i is None else i for i in mit.take(N, mit.padnone(a))]
# [1, '', '', '', '']
Run Code Online (Sandbox Code Playgroud)
gnibbler的答案更好,但如果你需要内置,你可以使用itertools.izip_longest
(zip_longest
在Py3k中):
itertools.izip_longest( xrange( N ), list )
Run Code Online (Sandbox Code Playgroud)
这将返回( i, list[ i ] )
填充为无的元组列表.如果您需要摆脱柜台,请执行以下操作:
map( itertools.itemgetter( 1 ), itertools.izip_longest( xrange( N ), list ) )
Run Code Online (Sandbox Code Playgroud)
您还可以使用没有任何内置程序的简单生成器。但是我不会填充列表,而是让应用程序逻辑处理空列表。
无论如何,没有构建的迭代器
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()
Run Code Online (Sandbox Code Playgroud)
如果你想用 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)
Run Code Online (Sandbox Code Playgroud)
使用迭代器并利用默认参数next
:
i = iter(a)
a = [next(i, '') for _ in range(N)]
Run Code Online (Sandbox Code Playgroud)
无论哪种方式,我们都想生产N
物品。因此for _ in range(N)
。那么元素应该是尽可能多的,a
其余的''
。使用迭代器a
我们获取所有可能的元素,当我们获取 时StopIteration
,将返回默认值''
,即。
归档时间: |
|
查看次数: |
43377 次 |
最近记录: |