如何将嵌套列表中的浮点数舍入到小数点后两位?

问题描述 投票:1回答:6

我有几个多边形的坐标列表,如下所示:

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]]]

如何在保持格式的同时将列表中的所有数字四舍五入到小数点后2位?

我尝试过l_b = [ '%.2f' % elem for elem in l_b ],但它给了我TypeError: must be real number, not list

python coordinates rounding nested-lists
6个回答
4
投票

您可以使用递归如果您的列表是任意嵌套的。如果您的列表是3层嵌套的,则使用@Guy的答案或@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)

输出

[[['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']]]

3
投票

您有3个嵌套列表级别,因此需要向下钻取

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

2
投票

@ Guy的解决方案有一个副作用。它使列表变平。

这可能更合适。

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

2
投票

您可以将map()round()一起使用。 round()可以将所需的位数作为第二个参数。

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

2
投票

尝试这种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]]])

数组的形状为(4,5,2)

应用映射将小数点后两位取整]

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

转换回原始形状

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

Georgy建议的一种更简单的方法>

l_b.round(2)

您可以将round内置函数与列表理解一起使用:

l_b = [[[round(e, 2) for e in j] for j in i] for i in l_b]

1
投票

您可以将round内置函数与列表理解一起使用:

© www.soinside.com 2019 - 2024. All rights reserved.