Форматирование списка кортежей в десятичные дроби и добавление их в файл - PullRequest
0 голосов
/ 15 ноября 2018

У меня есть список кортежей в качестве координат (так должно быть)

points = [(x1, y1), (x2, y2), ...]

чтобы нарисовать многоугольник в matplotlib. Чтобы получить эти координаты, я сначала создал пустой список points = [], а затем написал функцию для вычисления каждой точки по координатам центра, числу сторон, длине стороны и углу поворота. После функции я написал код, чтобы прочитать вышеуказанные начальные значения из пользовательского ввода и проверить их правильность, а затем вызвать функцию, если проверка прошла успешно.

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

количество баллов
x1, y1
х2, у2
...
xn, yn

где каждая координата записана с 3 десятичными знаками Поэтому мне нужно отформатировать мои кортежи до 3 десятичных знаков, затем преобразовать их в строки, а затем записать их в файл, и я хочу сделать это как можно быстрее.

Я думал, что сделаю что-то вроде lines = [float("{:.3f}".format(j)) for j in points] (что не работает, так как у меня есть кортежи), а затем

lines.insert(0, len(points))
with open('points.txt', 'w') as f:
f.writelines("%s\n" % l for l in lines)

Приведенное выше решение кажется мне очень приятным, но я не могу найти способ сделать первую строку (форматирование в десятичные числа) для кортежей, поэтому мне было интересно, как я могу отформатировать список кортежей в десятичные числа для хранения их в списке для последующего использования writelines и преобразования в строки? Или, если есть более короткий и лучший способ сделать это, я был бы признателен за любые подсказки. Спасибо!

Ответы [ 3 ]

0 голосов
/ 15 ноября 2018

Вы смешиваете несколько вещей. Нет необходимости добавлять номер в список, а также не нужно создавать список промежуточных строк. Также форматирование проще, например:

with open('points.txt', 'w') as f:
    f.write(str(len(points)))
    for x, y in points:
        f.write(f"{x:.2f}, {y:.2f}\n")
0 голосов
/ 15 ноября 2018

Вы можете напрямую записать числа с плавающей точкой в ​​ваш файл:

Тестовые данные:

import random

tupledata = [(random.uniform(-5,5),random.uniform(-5,5) ) for _ in range(10)]
print(tupledata)

Вывод:

[(1.4248082335110652, 1.9169955985773148), (0.7948001195399392, 0.6827204752328884),
 (-0.7506234890561183, 3.5787165366514735), (-1.0180103847958843, 2.260945997153615), 
 (-2.951745273938622, 4.0178333333006435), (1.8200624561140613, -2.048841087823593), 
 (-2.2727453771856765, 1.3697390993773828), (1.3427726323007603, -1.7616141110472583), 
 (0.5022889371913024, 4.88736204694349), (2.345381610723872, -2.2849852099748915)]

Запись в формате:

with open("n.txt","w") as w:
    # w.write(f"{len(tupledata)}\n")  # uncomment for line number on top
    for t in tupledata:                 
        w.write("{:.3f},{:.3f}\n".format(*t)) 

        # for python 3.6 up you can alternatively use string literal interpolation:
        # see    https://www.python.org/dev/peps/pep-0498/

        # w.write(f"{t[0]:.3f},{t[1]:.3f}\n")

with open("n.txt","r") as r:
    print(r.read())

Вывод в файл:

1.425,1.917
0.795,0.683
-0.751,3.579
-1.018,2.261
-2.952,4.018
1.820,-2.049
-2.273,1.370
1.343,-1.762
0.502,4.887
2.345,-2.285

См. собственное имя для оператора python *? , что делает *t.Подсказка: print(*[1,2,3]) == print(1,2,3)


0 голосов
/ 15 ноября 2018

Используйте распаковку кортежей при построении линий:

lines = ["{:.3f}, {:.3f}\n".format(*point) for point in points]

Таким образом, у вас уже есть список строк, которые вы можете легко записать в файл. Не нужно снова преобразовывать их в плавающие, просто снова приводить их в строку.

with open('points.txt', 'w') as f:
    f.writelines(lines)
...