150 votes

Quelques fonctions intégrées pour remplir une liste en python

J'ai une liste de taille < N et je veux le remplir jusqu'à la taille N avec une valeur.

Je peux certainement utiliser quelque chose comme ce qui suit, mais j'ai l'impression d'avoir oublié quelque chose :

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

0 votes

Pourquoi voulez-vous faire cela ? Il y a probablement un meilleur moyen.

0 votes

Je sérialise la liste dans une chaîne de caractères séparée par des tabulations avec le nombre fixe de colonnes.

0 votes

Vous voulez dire que vous faites quelque chose comme \t '.join([1,'','','','','']) ? Peut-être pouvez-vous nous en dire plus sur ce que vous avez l'intention de mettre en œuvre, puis nous pourrons essayer de trouver une idée.

237voto

gnibbler Points 103484
a += [''] * (N - len(a))

ou si vous ne voulez pas changer a en place

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

vous pouvez toujours créer une sous-classe de list et appeler la méthode comme bon vous semble

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

a = MyList(['1'])
b = a.ljust(5, '')

3 votes

Cela semble beaucoup mieux, mais je m'attends toujours à quelque chose comme une remplir o tampon méthode ou fonction =)

0 votes

Oups... TypeError: object of type 'int' has no len()

43voto

Nuno André Points 1095

Je pense que cette approche est plus visuelle et pythique.

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

4 votes

Cela me prend une demi-minute à comprendre. La réponse acceptée est beaucoup plus simple.

6 votes

@RichardMöhn "pythonique" signifie "idiomatique". Plus vous utiliserez Python, plus vous trouverez cette syntaxe naturelle.

13 votes

Je sais ce que signifie "pythonique". Et j'utilise Python de manière continue depuis 2014. Je ne trouve toujours pas votre réponse naturelle.

31voto

KennyTM Points 232647

Il n'existe pas de fonction intégrée pour cela. Mais vous pouvez composer les fonctions intégrées pour votre tâche (ou n'importe quoi d'autre :p).

(Modifié à partir de itertool's padnone y take recettes)

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)

Utilisation :

>>> list(pad([1,2,3], 7, ''))
[1, 2, 3, '', '', '', '']

0 votes

Belle approche : chain(iterable, repeat(padding))

9voto

pylang Points 12013

more-itertools est une bibliothèque qui comprend une padded outil pour ce genre de problème :

import more_itertools as mit

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

Alternativement, more_itertools implémente également Python recettes itertools y compris padnone y take comme mentionné par @kennytm, afin qu'ils n'aient pas à être réimplémentés :

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

Si vous souhaitez remplacer l'option par défaut None rembourrage, utilisez une liste de compréhension :

["" if i is None else i for i in mit.take(N, mit.padnone(a))]
# [1, '', '', '', '']

7voto

katrielalex Points 40655

La réponse de gnibbler est plus agréable, mais si vous avez besoin d'un buildin, vous pouvez utiliser itertools.izip_longest ( zip_longest dans Py3k) :

itertools.izip_longest( xrange( N ), list )

qui retournera une liste de tuples ( i, list[ i ] ) rempli à Aucun. Si vous devez vous débarrasser du compteur, faites quelque chose comme :

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

1 votes

Je savais que izip_longest mais le code qui en résulte n'est pas beau à voir =)

2 votes

Je crois que vous voulez dire operator.itemgetter() . De même, le None devaient être remplacées par "" .

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X