3 votes

Comment arrondir les flottants dans une liste imbriquée à 2 décimales ?

J'ai des listes de coordonnées de plusieurs polygones comme indiqué ci-dessous :

l_b =  [[[57.5, 2.875],
   [83.75, 4.1875],
   [83.75, 18.70923913043478],
   [57.50000000000001, 18.70923913043478],
   [57.5, 2.875]],
  [[83.75, 18.70923913043478],
   [57.50000000000001, 18.70923913043478],
   [57.5, 34.08695652173913],
   [83.75, 34.54347826086956],
   [83.75, 18.70923913043478]],
  [[0.0, 0.0],
   [18.125, 0.90625],
   [18.125, 16.70108695652174],
   [-2.530467720685112, 16.70108695652174],
   [0.0, 0.0]],
  [[18.125, 16.70108695652174],
   [-2.530467720685112, 16.70108695652174],
   [-5.0, 33.0],
   [18.125, 33.40217391304348],
   [18.125, 16.70108695652174]]]

Comment puis-je faire en sorte que tous les nombres de la liste soient arrondis à 2 décimales tout en conservant leur format ?

J'ai essayé l_b = [ '%.2f' % elem for elem in l_b ] mais il me donne TypeError: must be real number, not list

3voto

Guy Points 16347

Vous avez trois niveaux de listes imbriquées, vous devez donc effectuer une analyse descendante.

l_b = [[['%.2f' % y[0], '%.2f' % y[1]] for y in x] for x in l_b]

3voto

Ch3steR Points 15182

Vous pouvez utiliser récursivité si votre liste est arbitrairement imbriquée. Si votre liste est imbriquée à 3 niveaux, utilisez la réponse de @Guy ou celle de @mrEvgenX.

In [51]: def recur(lst):
    ...:     if isinstance(lst,float):
    ...:         return '%.2f'%lst #use round(lst,2) if you want float instead of string.
    ...:     else:
    ...:         return [recur(i) for i in lst]

In [52]: recur(l_b)

Sortie

[[['57.50', '2.88'],
  ['83.75', '4.19'],
  ['83.75', '18.71'],
  ['57.50', '18.71'],
  ['57.50', '2.88']],
 [['83.75', '18.71'],
  ['57.50', '18.71'],
  ['57.50', '34.09'],
  ['83.75', '34.54'],
  ['83.75', '18.71']],
 [['0.00', '0.00'],
  ['18.12', '0.91'],
  ['18.12', '16.70'],
  ['-2.53', '16.70'],
  ['0.00', '0.00']],
 [['18.12', '16.70'],
  ['-2.53', '16.70'],
  ['-5.00', '33.00'],
  ['18.12', '33.40'],
  ['18.12', '16.70']]]

2voto

mrEvgenX Points 61

La solution de @Guy a un effet secondaire. Elle a pour effet d'aplatir la liste.

Cela pourrait être plus approprié.

l_b = [[['%.2f' % z for z in y] for y in x] for x in l_b]

2voto

Shubham Shaswat Points 1066

Essayez cette approche numpy :

l_b = np.array( [[[57.5, 2.875],
   [83.75, 4.1875],
   [83.75, 18.70923913043478],
   [57.50000000000001, 18.70923913043478],
   [57.5, 2.875]],
  [[83.75, 18.70923913043478],
   [57.50000000000001, 18.70923913043478],
   [57.5, 34.08695652173913],
   [83.75, 34.54347826086956],
   [83.75, 18.70923913043478]],
  [[0.0, 0.0],
   [18.125, 0.90625],
   [18.125, 16.70108695652174],
   [-2.530467720685112, 16.70108695652174],
   [0.0, 0.0]],
  [[18.125, 16.70108695652174],
   [-2.530467720685112, 16.70108695652174],
   [-5.0, 33.0],
   [18.125, 33.40217391304348],
   [18.125, 16.70108695652174]]])

La forme du tableau est (4,5,2)

appliquer la carte pour arrondir les décimales à 2 chiffres

a=list(map(lambda x :round(x,2),l_b.flatten() ))

revenir à la forme d'origine

np.array(a).reshape(4,5,2)

ou

Une méthode beaucoup plus simple proposée par Georgy

l_b.round(2)

2voto

Daniel Giger Points 794

Vous pouvez utiliser map() avec round() . round() peut prendre le nombre de chiffres souhaité comme second argument.

for polygon in l_b:
    for point in polygon:
        point[:] = map(lambda x: round(x, 2), point)

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