Comment puis-je faire toutes mes sous-listes de la même longueur (la longueur de la sous-liste la plus longue) en ajoutant des np.nan à chaque sous-liste?

import random
[list(range(0,random.randint(1,5))) for x in range(n)]

Donc, si la sortie est:

[[0, 1], [0], [0, 1, 2, 3, 4], [0, 1, 2, 3, 4], [0, 1, 2, 3]]

Cela devrait ressembler à:

[[nan, nan, nan, 0, 1], [nan, nan, nan, nan, 0], [0, 1, 2, 3, 4], [0, 1, 2, 3, 4], [ nan, 0, 1, 2, 3]]

2
jchaykow 20 nov. 2018 à 22:16

3 réponses

Meilleure réponse

Tout d'abord, trouvez la longueur de la sous-liste la plus longue en utilisant max(). Ensuite, pour chaque sous-liste, utilisez une affectation de tranche pour remplacer le contenu de cette liste par le bon nombre de NaN s suivi de la liste d'origine.

import random, math

n = 5
lists = [list(range(0,random.randint(1,5))) for x in range(n)]

# get the maximum length
maxlen = len(max(lists, key=len))

# pad left of each sublist with NaN to make it as long as the longest
for sublist in lists:
    sublist[:] = [math.nan] * (maxlen - len(sublist)) + sublist
4
kindall 20 nov. 2018 à 19:27

Si tout ce qui vous intéresse est de générer le remplissage np.nan lors de la création aléatoire, cette simple doublure suffira:

[[np.nan]*(5-j) + list(range(j)) for j in (random.randint(1, 5) for x in range(5))]

# [[nan, 0, 1, 2, 3], 
#  [nan, nan, 0, 1, 2], 
#  [nan, nan, nan, 0, 1], 
#  [nan, 0, 1, 2, 3],
#  [0, 1, 2, 3, 4]]

Vous pouvez bien sûr remplacer 5 par n et déterminer votre longueur maximale.

0
r.ook 20 nov. 2018 à 19:36

Pas le code le plus pythonique mais je pense qu'il fait l'affaire:

longest_list_length = 0
for sublist in output:
  if len(sublist) > longest_list_length:
    longest_list_length = len(sublist)

for sublist in output:
  nans_to_prepend = ['nan'] * (longest_list_length - len(sublist))
  sublist = nans_to_prepend + sublist
0
ritratt 20 nov. 2018 à 19:26