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

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)

  • 这看起来好多了,但我仍然希望使用_fill_或_pad_方法或函数=) (2认同)

Nun*_*dré 23

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

a = (a + N * [''])[:N]
Run Code Online (Sandbox Code Playgroud)

  • 我知道“Pythonic”是什么意思。我从 2014 年开始就一直在使用 Python。我仍然觉得你的答案不太自然。 (10认同)
  • @RichardMöhn“pythonic”的意思是“惯用的”。使用 Python 的时间越长,你就会发现这种语法越自然。 (5认同)
  • 是什么让构造一个中间废弃列表变得Pythonic? (3认同)
  • 这个答案与公认的答案不同,它强制执行“N”的长度,这可能是理想的。取决于应用程序,这就是这个答案有用的原因。 (3认同)
  • 我花了半分钟才明白。接受的答案要简单得多。 (2认同)

ken*_*ytm 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)
Run Code Online (Sandbox Code Playgroud)

用法:

>>> list(pad([1,2,3], 7, ''))
[1, 2, 3, '', '', '', '']
Run Code Online (Sandbox Code Playgroud)


pyl*_*ang 6

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

import more_itertools as mit

list(mit.padded(a, "", N))
# [1, '', '', '', '']
Run Code Online (Sandbox Code Playgroud)

另外,more_itertools还实现了Python的itertools食谱,包括padnonetake由@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)


Kat*_*iel 5

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)

  • 我相信你的意思是 `operator.itemgetter()`。此外,`None` 值需要替换为 `""`。 (2认同)

Thi*_*rry 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()
Run Code Online (Sandbox Code Playgroud)


Fed*_*ico 5

如果你想用 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)

  • 坦白说,_a+['']*(N-len(a))_看起来清晰多了。此外,它缺乏演员名单。但无论如何还是谢谢你。 (2认同)

Tom*_*koo 5

使用迭代器并利用默认参数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,将返回默认值'',即。