Печать отформатированных поплавков во вложенном кортеже смешанного типа

У меня есть список кортежей, где записи в кортежах смешанного типа (int, float, tuple) и я хочу напечатать каждый элемент списка в одну строку.

Пример списка:

 [('520',
     (0.26699505214910974, 9.530913611077067e-22, 1431,
     (0.21819421133984918, 0.31446394340528838), 11981481)),
 ('1219',
     (0.2775519783082116, 2.0226340976042765e-25, 1431,
     (0.22902629625165472, 0.32470159534237308), 14905481))]

Я хотел бы напечатать каждый кортеж в виде одной строки с плавающей точкой, отформатированной для вывода на десятитысячное место:

 [('520', (0.2669, 9.5309e-22, 1431, (0.2181, 0.3144), 11981481)),
 ('1219', (0.2775, 2.0226e-25, 1431, (0.2290, 0.3247), 14905481))]

Я использовал pprint чтобы получить все на одной линии

pprint(myList, depth=3, compact=True)
> ('1219', (0.2775519783082116, 2.0226340976042765e-25, 1431, (...), 14905481))]

но я не был уверен, как правильно отформатировать поплавки в питонической манере. (Должен быть более хороший способ сделать это, чем циклически проходить по списку, проходить через каждый кортеж, проверять if-float/if-int/if-tuple и конвертировать все плавающие через "%6.4f" % x).

1 ответ

Решение

Это не совсем то, что вам нужно, но очень близко, и код довольно компактен.

def truncateFloat(data):
    return tuple( ["{0:.4}".format(x) if isinstance(x,float) else (x if not isinstance(x,tuple) else truncateFloat(x)) for x in data])
pprint(truncateFloat(the_list))

Для вашего примера результат

(('520', ('0.267', '9.531e-22', 1431, ('0.2182', '0.3145'), 11981481)),
 ('1219', ('0.2776', '2.023e-25', 1431, ('0.229', '0.3247'), 14905481)))

Вы можете играть с вариантами .format() чтобы получить то, что вы хотите.

Другие вопросы по тегам