[英]Array of strings coordinates into array of integers in python
我有一個字符串坐標數組:
A = [ '(0.0),(3,3),(5,8)', '(1,2),(5,8),(8,9),(20,6)' , '(45,6),(91,5),(86,4)' , '(100,2),(105,8),(53,6)']
我需要將這些轉換為整數,到目前為止,我已經嘗試使用int(A
) 或float(A)
進行轉換。
通過使用int()
我得到這個錯誤:
"ValueError: invalid literal for int() with base 10: '(0, 0),(3, 0),(6, 0),(6, 5),(13, 0),(25, 5),(27, 5),(29, 5),(30, 0),(35, 5),(37, 5),(38, 5),(45, 0),(52, 0),(53, 5),(56, 0),(58, 0),(60, 0),(60, 5),(61, 5),(66, 0),(66, 5),(73, 0),(74, 0),(75, 5),(76"
(假設 0.0 是一個錯字)
正如 S3DEV 所建議的那樣,一種快速的方法是使用某種類型的eval()
,但不建議這樣做。
[list(eval(i)) for i in A]
[[(0, 0), (3, 3), (5, 8)],
[(1, 2), (5, 8), (8, 9), (20, 6)],
[(45, 6), (91, 5), (86, 4)],
[(100, 2), (105, 8), (53, 6)]]
eval
與literal_eval
的比較
eval:
這是非常強大的,但如果您接受來自不受信任輸入的字符串來評估,這也是非常危險的。 想象一下在rm -rf /
上使用 eval !!
ast.literal_eval:
僅對有限的一組 python 文字結構進行操作。 這使得 if 更安全。
在您的情況下,由於您的輸入是坐標字符串(確保這一點。)那么這兩種方法對您來說同樣安全/不安全。
正如我在對該問題的評論中提到的,一種方法是使用安全的eval
方法,例如ast.literal_eval
將字符串解析為元組。
假設(0.0)
應該是(0,0)
:
import ast
[ast.literal_eval(i) for i in A]
Output:
[((0, 0), (3, 3), (5, 8)),
((1, 2), (5, 8), (8, 9), (20, 6)),
((45, 6), (91, 5), (86, 4)),
((100, 2), (105, 8), (53, 6))]
正則表達式解決方案怎么樣? 恕我直言,有點干凈,不需要使用eval
。
import re
A = ['(0,0),(3,3),(5,8)', '(1,2),(5,8),(8,9),(20,6)', '(45,6),(91,5),(86,4)', '(100,2),(105,8),(53,6)']
pattern = re.compile(r'\((\d+), *(\d+)\)')
[[(int(x), int(y)) for x, y in position] for position in [re.findall(pattern, group) for group in A]]
>> [[(0, 0), (3, 3), (5, 8)],
[(1, 2), (5, 8), (8, 9), (20, 6)],
[(45, 6), (91, 5), (86, 4)],
[(100, 2), (105, 8), (53, 6)]]
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.