簡體   English   中英

將字符串列表轉換為元組

[英]Convert a list of string into tuples

我有這個字符串列表:

['(39.2947500000, -76.6565600000)', '(39.3423900000, -76.5698300000)', '(39.3199500000, -76.6222000000)', '(39.2533200000, -76.6263600000)', '(39.3068100000, -76.6549700000)', '(39.2937500000, -76.6233700000)', '(39.3146700000, -76.6425300000)', '(39.3073300000, -76.6015900000)', '(39.2451900000, -76.6336400000)', '(39.3283000000, -76.5893200000)', '(39.3215400000, -76.6736800000)', '(39.3010000000, -76.5977400000)', '(39.3122600000, -76.6194200000)', '(39.3161400000, -76.5663900000)', '(39.3573500000, -76.6005300000)', '(39.3311200000, -76.6315100000)', '(39.3311200000, -76.6315100000)', '(39.2832900000, -76.5996300000)', '(39.2868200000, -76.6063900000)', '(39.3031200000, -76.6461100000)']

我需要將此字符串轉換為元組,以便輸出為:

[(39.2947500000, -76.6565600000),(39.3423900000, -76.5698300000)......]

我嘗試使用float方法,但它給出了此錯誤:

ValueError:無法將字符串轉換為float:(39.2947500000,-76.6565600000)

提前致謝

>>> L=['(39.2947500000, -76.6565600000)', '(39.3423900000, -76.5698300000)', '(39.3199500000, -76.6222000000)', '(39.2533200000, -76.6263600000)', '(39.3068100000, -76.6549700000)', '(39.2937500000, -76.6233700000)', '(39.3146700000, -76.6425300000)', '(39.3073300000, -76.6015900000)', '(39.2451900000, -76.6336400000)', '(39.3283000000, -76.5893200000)', '(39.3215400000, -76.6736800000)', '(39.3010000000, -76.5977400000)', '(39.3122600000, -76.6194200000)', '(39.3161400000, -76.5663900000)', '(39.3573500000, -76.6005300000)', '(39.3311200000, -76.6315100000)', '(39.3311200000, -76.6315100000)', '(39.2832900000, -76.5996300000)', '(39.2868200000, -76.6063900000)', '(39.3031200000, -76.6461100000)']
>>> import ast
>>> list(map(lambda x:ast.literal_eval(x), L))
[(39.29475, -76.65656), (39.34239, -76.56983), (39.31995, -76.6222), (39.25332, -76.62636), (39.30681, -76.65497), (39.29375, -76.62337), (39.31467, -76.64253), (39.30733, -76.60159), (39.24519, -76.63364), (39.3283, -76.58932), (39.32154, -76.67368), (39.301, -76.59774), (39.31226, -76.61942), (39.31614, -76.56639), (39.35735, -76.60053), (39.33112, -76.63151), (39.33112, -76.63151), (39.28329, -76.59963), (39.28682, -76.60639), (39.30312, -76.64611)]

對於python 2.x: map(lambda x:ast.literal_eval(x), L)

編輯:一些解釋:

ast代表抽象語法樹。 literal_eval()eval()安全得多。

引用官方文檔:

ast.literal_eval(node_or_string)安全地評估表達式節點或包含Python文字或容器顯示的Unicode或Latin-1編碼的字符串。 提供的字符串或節點只能由以下Python文字結構組成:字符串,數字,元組,列表,字典,布爾值和無。

這可用於安全地評估包含來自不受信任來源的Python值的字符串,而無需自己解析值。 它不能評估任意復雜的表達式,例如涉及運算符或索引的表達式。

您可以使用eval

a = ['(39.2947500000, -76.6565600000)', '(39.3423900000, -76.5698300000)', '(39.3199500000, -76.6222000000)', '(39.2533200000, -76.6263600000)', '(39.3068100000, -76.6549700000)', '(39.2937500000, -76.6233700000)', '(39.3146700000, -76.6425300000)', '(39.3073300000, -76.6015900000)', '(39.2451900000, -76.6336400000)', '(39.3283000000, -76.5893200000)', '(39.3215400000, -76.6736800000)', '(39.3010000000, -76.5977400000)', '(39.3122600000, -76.6194200000)', '(39.3161400000, -76.5663900000)', '(39.3573500000, -76.6005300000)', '(39.3311200000, -76.6315100000)', '(39.3311200000, -76.6315100000)', '(39.2832900000, -76.5996300000)', '(39.2868200000, -76.6063900000)', '(39.3031200000, -76.6461100000)'] 
b = [ eval(x) for x in a ]
my_list = ['(39.2947500000, -76.6565600000)', '(39.3423900000, -76.5698300000)']
print [(float(x.split(',')[0][1:]), float(x.split(',')[1][1:-1])) for x in my_list]

此解決方案不使用eval(我不喜歡使用eval),而是對字符串進行迭代,將它們拆分為',',對其進行子字符串刪除以刪除'(',''和')',然后將其轉換為浮點數

如果您希望避免import ,您會感到
這可能是避免列表理解以利於清楚的地方*:

lst = ['(39.2947500000, -76.6565600000)', '(39.3423900000, -76.5698300000)', '(39.3199500000, -76.6222000000)', '(39.2533200000, -76.6263600000)', '(39.3068100000, -76.6549700000)', '(39.2937500000, -76.6233700000)', '(39.3146700000, -76.6425300000)', '(39.3073300000, -76.6015900000)', '(39.2451900000, -76.6336400000)', '(39.3283000000, -76.5893200000)', '(39.3215400000, -76.6736800000)', '(39.3010000000, -76.5977400000)', '(39.3122600000, -76.6194200000)', '(39.3161400000, -76.5663900000)', '(39.3573500000, -76.6005300000)', '(39.3311200000, -76.6315100000)', '(39.3311200000, -76.6315100000)', '(39.2832900000, -76.5996300000)', '(39.2868200000, -76.6063900000)', '(39.3031200000, -76.6461100000)']

out = list()
for i in lst:
    j,k = i.split(",")
    out.append(tuple((float(j[1:]), float(k[:-1]))))
print(out)



*參見https://www.python.org/dev/peps/pep-0020/

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM