2009-08-20 34 views
19

Given:Python chuỗi suy sử dụng từ điển và chuỗi

dict = {"path": "/var/blah"} 
curr = "1.1" 
prev = "1.0" 

là gì/con đường ngắn nhất tốt nhất để suy chuỗi để tạo ra những điều sau:

đường dẫn:/var/blah Curr: 1.1 trước : 1,0

tôi biết điều này:

str = "path: %(path)s curr: %(curr)s prev: %(prev)s" % {"path": dict["path"],"curr": curr, "prev": prev} 

Nhưng tôi đã hy vọng có một cách ngắn hơn, chẳng hạn như:

str = "path: %(path)s curr: %s prev: %s" % (dict, curr, prev) 

lời xin lỗi của tôi nếu điều này có vẻ như là một câu hỏi quá pedantic.

Trả lời

13

Tại sao không:

mystr = "path: %s curr: %s prev: %s" % (mydict[path], curr, prev) 

BTW, tôi đã thay đổi một vài tên mà bạn đang sử dụng mà chà đạp trên các tên BUILTIN - không làm được điều đó, nó không bao giờ cần thiết và một lần trong một thời gian sẽ lãng phí rất nhiều thời gian của bạn theo dõi xuống một hành vi sai trái nó gây ra (nơi một cái gì đó bằng cách sử dụng tên dựng sẵn giả định nó có nghĩa là nội trang nhưng bạn đã ẩn nó với tên của biến riêng của chúng tôi).

12

Có thể:

path = dict['path'] 
str = "path: %(path)s curr: %(curr)s prev: %(prev)s" % locals() 

Tôi có nghĩa là nó hoạt động:

>>> dict = {"path": "/var/blah"} 
>>> curr = "1.1" 
>>> prev = "1.0" 
>>> path = dict['path'] 
>>> str = "path: %(path)s curr: %(curr)s prev: %(prev)s" % locals() 
>>> str 
'path: /var/blah curr: 1.1 prev: 1.0' 

Tôi chỉ không biết nếu bạn xem xét rằng ngắn hơn.

+2

Tránh sử dụng của người dân địa phương() & globals() :( – dzen

+0

@dzen Tại sao tránh người dân địa phương()? Tôi đã thử tìm kiếm lời khuyên này ở nơi khác và tôi không tìm thấy nhiều. – bradreaves

+2

Sử dụng ' locals() 'có nghĩa là không rõ ràng biến nào bạn đang thực sự Nếu bạn muốn pylint mã của bạn, pylint cũng có thể báo cáo rằng một số biến không được sử dụng ngay cả khi bạn tham chiếu chúng với' locals() '. Để kiểm tra tất cả các câu lệnh định dạng chuỗi cho việc sử dụng ngầm định như vậy, vì vậy nó là một lối tắt có các hàm ý bạn cần phải hiểu trước khi sử dụng – hughdbrown

45

Bạn có thể thử này:

data = {"path": "/var/blah", 
     "curr": "1.1", 
     "prev": "1.0"} 

s = "path: %(path)s curr: %(curr)s prev: %(prev)s" % data 
+1

Điều này dễ đọc hơn và rõ ràng hơn. – neowulf33

21

Và dĩ nhiên bạn có thể sử dụng phiên bản mới hơn (từ 2.6) .format phương pháp chuỗi:

>>> mydict = {"path": "/var/blah"} 
>>> curr = "1.1" 
>>> prev = "1.0" 
>>> 
>>> s = "path: {0} curr: {1} prev: {2}".format(mydict['path'], curr, prev) 
>>> s 
'path: /var/blah curr: 1.1 prev: 1.0' 

Hoặc, nếu tất cả các yếu tố đều có trong từ điển, bạn có thể làm điều này:

>>> mydict = {"path": "/var/blah", "curr": 1.1, "prev": 1.0} 
>>> "path: {path} curr: {curr} prev: {prev}".format(**mydict) 
'path: /var/blah curr: 1.1 prev: 1.0' 
>>> 

Từ tài liệu str.format() Tài liệu:

Phương pháp này của định dạng chuỗi là tiêu chuẩn mới trong Python 3.0, và nên được ưa thích đến thư mục% định dạng được mô tả trong String Formatting Operations trong mã mới.

+3

Sử dụng str.format, anh ta có thể viết '" đường dẫn: {mydict [path]} curr: {curr} prev: {prev} ". Định dạng (mydict = mydict, curr = curr, prev = prev)' hoặc thậm chí 'local () 'đối số cho định dạng,' "đường dẫn: {mydict [path]} curr: {curr} prev: {prev}". định dạng (** locals()) ' – johnny

2

Bạn có thể làm như sau nếu bạn đặt dữ liệu của bạn trong một từ điển:

data = {"path": "/var/blah","curr": "1.1","prev": "1.0"} 

"{0}: {path}, {1}: {curr}, {2}: {prev}".format(*data, **data) 
+0

Đây là cách tốt nhất. – Bhargav

3

Bạn cũng có thể (sớm) sử dụng f-strings bằng Python 3.6, mà có lẽ là con đường ngắn nhất để định dạng một chuỗi:

print f'path: {path} curr: {curr} prev: {prev}' 

Và thậm chí đặt tất cả các dữ liệu của bạn trong một dict:

d = {"path": path, "curr": curr, "prev": prev} 
print f'path: {d["path"]} curr: {d["curr"]} prev: {d["prev"]}' 
1

Nếu bạn không muốn thêm các biến không thay đổi để bạn từ điển từng thời gian, bạn có thể tham khảo cả các biến và các phím từ điển sử dụng định dạng:

str = "path {path} curr: {curr} prev: {prev}".format(curr=curr, prev=prev, **dict)

Nó có thể là hình thức xấu một cách logic, nhưng tôi t làm cho mọi thứ mong đợi hơn mô-đun curr và prev để được chủ yếu là tĩnh và từ điển để cập nhật.

1

Cập nhật 2016: Tính đến Python 3.6 bạn có thể thay thế các biến thành chuỗi theo tên:

>>> origin = "London" 
>>> destination = "Paris" 
>>> f"from {origin} to {destination}" 
'from London to Paris' 

Note tiền tố f". Nếu bạn thử điều này trong Python 3.5 hoặc cũ hơn, bạn sẽ nhận được SyntaxError.

Xem https://docs.python.org/3.6/reference/lexical_analysis.html#f-strings

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