Как преобразовать массив строк кортежей в массив кортежей?

Моя ситуация заключается в том, что я пытаюсь преобразовать массив кортежей в строковом формате в массив кортежей.

то есть я хочу перейти от:

['(-109.080842,45.002073)','(-105.91517,45.002073)','(-109.080842,45.002073)']

to

[(-109.080842,45.002073),(-105.91517,45.002073),(-109.080842,45.002073)]

Цель этого состоит в том, чтобы иметь возможность создать красивый многоугольник. Выдает ошибку, когда кортежи являются строкой. Каков наилучший способ перейти от строк к фактическим объектам кортежа?


person BShaps    schedule 28.03.2018    source источник
comment
Вы можете анализировать кортежи встроенных объектов Python с помощью ast.literal_eval.   -  person abarnert    schedule 29.03.2018
comment
Но прежде чем вы убежите и сделаете это, почему у вас есть представления кортежей в виде строк? Если вы сохраняете данные, записывая их в файл таким образом, есть гораздо лучшие способы сделать это.   -  person abarnert    schedule 29.03.2018
comment
@abarnert Плохой код от кого-то другого, где они манипулировали строкой, чтобы получить ее в странном формате. Оказывается, я могу просто выполнить ast.literal_eval для строки, возвращаемой типом многоугольника postgres, и все работает.   -  person BShaps    schedule 29.03.2018


Ответы (2)


Это литералы, поэтому вы можете безопасно их оценивать:

>>> import ast
>>> L = ['(-109.080842,45.002073)','(-105.91517,45.002073)','(-109.080842,45.002073)']
>>> [ast.literal_eval(x) for x in L]
[(-109.080842, 45.002073), (-105.91517, 45.002073), (-109.080842, 45.002073)]
person wim    schedule 28.03.2018
comment
На самом деле они не литералы. Но literal_eval все равно с ними работает . - person abarnert; 29.03.2018
comment
Хм, странно, когда я напечатал свой массив строк кортежа после выполнения ast.literal_eval, он по-прежнему отображал их как строки, но это сработало при передаче его в стройный многоугольник. Спасибо! - person BShaps; 29.03.2018
comment
@абарнерт Ха. ТИЛ. - person wim; 29.03.2018

Это функциональный способ с ast.literal_eval:

from ast import literal_eval

lst = ['(-109.080842,45.002073)','(-105.91517,45.002073)','(-109.080842,45.002073)']

res = list(map(literal_eval, lst))

# [(-109.080842, 45.002073), (-105.91517, 45.002073), (-109.080842, 45.002073)]
person Community    schedule 28.03.2018