J'ai une liste de valeurs flottantes qui représentent l'heure d'une observation. (Chaque valeur flottante peut effectivement être représentée comme un entier, mais j'espère pouvoir généraliser pour d'éventuelles circonstances futures).Comment un pad peut-il mettre un zéros entre des éléments flottants non consécutifs d'une liste triée contenant des doublons?
list_hrs = [4,6,8,8,10] # actual list is thousands of floats
Je suis en train de rembourrer les valeurs qui ne correspondent pas à leurs indices avec zéro tout en ne comptant que une seule occurrence d'entrées en double. Par exemple la liste, je veux
list_hrs = [0,0,0,0,4,0,6,0,8,8,0,10]
Les quatre premières entrées sont 0
parce qu'il ya quatre numéros inclusivement 0
-3
. Le 0
entre 4
et 6
est voulu là parce que 5
est manquant; de même pour 0
entre 6
et 8
. Le 0
entre 8
et 10
est recherché ici parce que la valeur 9
est manquante. De plus, les doublons 8
ne sont pas touchés, car ils seront traités plus tard dans mon code; une seule occurrence de la copie 8
doit être prise en compte avant le remplissage 0
.
Ma première tentative a été d'essayer ceci:
for index in range(len(list_hrs)):
if list_hrs != index:
list_hrs.insert(index, 0)
>> [0, 0, 0, 0, 0, 4, 6, 8, 8, 10]
J'ai lu alors différents SO messages et sont repartis avec l'impression qu'il vaut mieux d'abord faire une liste des 0
« s, dont la longueur doit être égal au nombre de points de données considérés. Ensuite, les entrées non nulles peuvent remplacer les entrées 0
. Donc, j'ai essayé le texte suivant:
def make_zeros(hrs=list_hrs): # make list of 0's
num_zer = int(max(hrs))
list_zer = [0 for index in range(num_zer+1)]
return list_zer
Mais je ne suis pas sûr de la façon de mettre en œuvre la condition pour obtenir le résultat désiré après ce point. Je pense qu'il existe un moyen d'utiliser enumerate
pour vérifier si l'index correspond à la valeur de cet index, mais je ne sais pas comment procéder en raison d'entrées en double (comme les 8
dans l'exemple ci-dessus).
Cette méthode est-elle une bonne direction pour continuer à fonctionner, ou existe-t-il un moyen plus efficace/plus simple d'atteindre le résultat souhaité? Toute aide ou conseil serait apprécié.
Pourquoi sont-ils flottants, attendez-vous des nombres décimaux là-dedans? Comme pourrait-il être dit «4.2»? Si oui, comment devrait ressembler la sortie? – Divakar
En outre, l'entrée serait-elle toujours triée? – Divakar
Chaque flottant peut effectivement être interprété comme un nombre entier. La liste d'exemples devrait en fait être '[4.0.6.0,8.0,8.0,10.0]'. J'espérais juste généraliser le code. Mais s'il y a une solution pour le cas des entiers, cela fonctionnera bien pour ce cas. – mikey