2009-11-27 26 views
14

tôi có các chuỗi mà trông như thế này:Phân tích một chuỗi đại diện cho một danh sách các hàng

"(8, 12.25), (13, 15), (16.75, 18.5)" 

và tôi muốn chuyển đổi mỗi trong số họ thành một cấu trúc dữ liệu python. Tốt hơn là một danh sách (hoặc bộ tuple) các bộ dữ liệu chứa một cặp giá trị float.

Tôi có thể làm điều đó với eval("(8, 12.25), (13, 15), (16.75, 18.5)") cho tôi một bộ tuple, nhưng tôi không nghĩ rằng việc đánh giá một cách ngây thơ thông tin bên ngoài sẽ là một quyết định khôn ngoan.

Vì vậy, tôi tự hỏi một giải pháp thanh tao có thể trông như thế nào.

Trả lời

21
>>> import ast 
>>> print ast.literal_eval("(8, 12.25), (13, 15), (16.75, 18.5)") 
((8, 12.25), (13, 15), (16.75, 18.5)) 
+1

jfyi, điều này có thể không được mạnh mẽ để có một đơn Nếu bạn nhập là "(8, 12,25)". Bạn sẽ chỉ nhận được một tuple thay vì một tuple trong một tuple. Tôi tin rằng bạn sẽ nhận được tuple lồng nhau mong muốn nếu đầu vào là "(8, 12.25), "(lưu ý dấu phẩy sau). Nhưng tôi đã không kiểm tra điều này vì tôi không cài đặt python 2.6 trên máy này. – Tom

+0

Tốt bắt Tom. Tôi chưa nghĩ về điều đó và nó thực sự sẽ là một vấn đề trong tình hình của tôi, tôi sẽ kiểm tra điều đó sau khi phân tích cú pháp. là không có sẵn trong python2.5 nhưng trong trường hợp của tôi đó là ok như tôi đang sử dụng nó trong một tập lệnh nhập dữ liệu công cụ ứng dụng và không có trong bản thân công cụ ứng dụng. – tosh

+0

+1: Không biết 'ast.literal_eval' trước đây - và nó rất tiện dụng! –

1

Nếu bạn đang làm việc với tệp CSV và bạn muốn nhiều hơn giải pháp "ngây thơ" không xử lý bất kỳ lỗi nào, có lẽ bạn nên sử dụng Python's CSV module.

+0

Xin lỗi tôi đã xác định câu hỏi một chút mơ hồ. Chuỗi thực sự là một giá trị mà tôi nhận được là một trong các giá trị được phân cách bằng dấu phẩy/dấu chấm phẩy. Tôi sẽ xóa bit CSV khỏi câu hỏi vì nó có thể gây nhầm lẫn. Tôi đang sử dụng mô-đun CSV bằng cách này. Nó thật tuyệt. Cảm ơn bạn đã trả lời. – tosh

1

Tải xuống PyParsing.

Tôi đã làm việc với nó trước đây. Bạn có thể nhận được một số hành vi phân tích khá mạnh mẽ từ nó, và tôi nghĩ rằng nó cung cấp nội trang sẽ xử lý toàn bộ nhu cầu phân tích cú pháp của bạn với loại điều này. Tra cứu commaSeparatedList và nestedExpr.

3
def parse(s): 
    tuples = s.split('), ') 
    out = [] 
    for x in tuples: 
     a,b = x.strip('()').split(', ') 
     out.append((float(a),float(b))) 
    return out 

việc này sẽ thực hiện công việc.

2

Tôi đã sử dụng safe_eval cho các công việc như thế này trong quá khứ.

1

có vấn đề gì khi thực hiện nó một cách có hệ thống? chia trên ")", sau đó đi qua danh sách, loại bỏ tất cả "(".

>>> s="(8, 12.25), (13, 15), (16.75, 18.5)" 
>>> [ i.replace("(","") for i in s.split(")") ] 
['8, 12.25', ', 13, 15', ', 16.75, 18.5', ''] 
>>> b = [ i.replace("(","") for i in s.split(")") ] 
>>> for i in b: 
... print i.strip(", ").replace(" ","").split(",") 
... 
['8', '12.25'] 
['13', '15'] 
['16.75', '18.5'] 
[''] 

Bây giờ bạn có thể mang mỗi phần tử vào cấu trúc dữ liệu của bạn.

Các vấn đề liên quan