2009-09-21 39 views
83

Vì vậy, tôi có vấn đề này. Tôi nhận được tuple (1,2,3) mà tôi nên in với định dạng chuỗi. ví dụ:In tuple với định dạng chuỗi trong Python

tup = (1,2,3) 
print "this is a tuple %something" % (tup) 

và điều này nên in đại diện tuple với dấu ngoặc, như

Đây là một tuple (1,2,3)

Nhưng tôi nhận được TypeError: not all arguments converted during string formatting để thay thế.

Làm cách nào để tôi có thể thực hiện việc này? Kinda mất ở đây nên nếu các bạn có thể chỉ cho tôi một hướng đi đúng :)

Trả lời

151
>>> thetuple = (1, 2, 3) 
>>> print "this is a tuple: %s" % (thetuple,) 
this is a tuple: (1, 2, 3) 

Làm một tuple singleton với tuple quan tâm như mục duy nhất, ví dụ: phần (thetuple,), là bit quan trọng ở đây.

8

này không sử dụng chuỗi định dạng, nhưng bạn sẽ có thể làm:

print 'this is a tuple ', (1, 2, 3) 

Nếu bạn thực sự muốn sử dụng chuỗi định dạng:

print 'this is a tuple %s' % str((1, 2, 3)) 
# or 
print 'this is a tuple %s' % ((1, 2, 3),) 

Lưu ý, điều này giả định bạn đang sử dụng phiên bản Python cũ hơn 3.0.

+1

Tôi nghĩ rằng đây là tao nhã hơn (và có thể đọc được) so với một tuple ôm. –

+0

Tôi ngạc nhiên câu trả lời này đã không chú ý nhiều hơn – Chris

20
>>> tup = (1, 2, 3) 
>>> print "Here it is: %s" % (tup,) 
Here it is: (1, 2, 3) 
>>> 

Lưu ý rằng (tup,) là một bộ chứa tuple. Tuple bên ngoài là đối số cho toán tử%. Tuple bên trong là nội dung của nó, nó thực sự được in.

(tup) là một biểu thức trong ngoặc đơn, khi được đánh giá kết quả theo số tup.

(tup,) với dấu phẩy sau là một bộ túp, chứa tup làm thành viên duy nhất.

4
t = (1, 2, 3) 

# the comma (,) concatenates the strings and adds a space 
print "this is a tuple", (t) 

# format is the most flexible way to do string formatting 
print "this is a tuple {0}".format(t) 

# classic string formatting 
# I use it only when working with older Python versions 
print "this is a tuple %s" % repr(t) 
print "this is a tuple %s" % str(t) 
1

Tôi nghĩ rằng cách tốt nhất để làm điều này là:

t = (1,2,3) 

print "This is a tuple: %s" % str(t) 

Nếu bạn đã quen thuộc với printf định dạng phong cách, sau đó Python hỗ trợ phiên bản riêng của mình. Trong Python, điều này được thực hiện bằng cách sử dụng toán tử "%" được áp dụng cho các chuỗi (một quá tải của toán tử modulo), nó lấy bất kỳ chuỗi nào và áp dụng định dạng kiểu printf cho nó.

Trong trường hợp của chúng tôi, chúng tôi đang yêu cầu in "Đây là một bộ dữ liệu:" và sau đó thêm chuỗi "% s" và đối với chuỗi thực tế, chúng tôi sẽ chuyển một chuỗi đại diện cho bộ dữ liệu (tuple) bằng cách gọi str (t)).

Nếu bạn không quen với định dạng kiểu printf, tôi khuyên bạn nên tìm hiểu, vì nó rất chuẩn. Hầu hết các ngôn ngữ đều hỗ trợ nó theo cách này hay cách khác.

34

Lưu ý rằng cú pháp % đã lỗi thời.Sử dụng str.format, đó là đơn giản hơn và dễ đọc hơn:

t = 1,2,3 
print 'This is a tuple {0}'.format(t) 
+0

Tôi đã thêm nhận xét vào http://stackoverflow.com/a/26249755/1676424 này đối với trường hợp 1 mục tuple –

+0

Tôi không bao giờ biết tại sao '%' là lỗi thời nhưng bây giờ tôi luôn là bạn 'str.format', một cách mù quáng. Không bao giờ, tôi quan tâm đến vòng loại đầy đủ là gì, bởi vì '{0}' đơn giản không phải là vòng loại đầy đủ, nhưng chỉ là một chỉ báo vị trí. Đối với 'int', cái mà tôi gọi là vòng loại đầy đủ sẽ là' {0: d} '(hoặc' {3: d} 'chẳng hạn, nếu int được in xảy ra ở vị trí thứ 4 trong' str.format 'phương thức). Tôi đã thử in một tuple bằng cách sử dụng '{0: s}' vòng loại nhưng nó không hoạt động. Vậy, vòng loại đầy đủ cho thứ gì đó giống như một bộ tuple? – Ray

+1

@Ray Điều đó không thực sự hợp lý. Có rất nhiều tùy chọn bạn có thể chỉ định, có thể tìm thấy trong tài liệu. Nếu bạn muốn in một cái gì đó bằng cách sử dụng 'str' bạn có thể nói' {! S} ', nhưng đây là mặc định, do đó, nó là không cần thiết. Nếu bạn muốn sử dụng 'repr' thay vào đó, bạn có thể làm' {! R} '. Không giống như '%', không cần phải nói 'd' cho số nguyên. – Antimony

0

Xin lưu ý dấu phẩy dấu sẽ được bổ sung nếu tuple chỉ có một mục. ví dụ:

t = (1,) 
print 'this is a tuple {}'.format(t) 

và bạn sẽ nhận được:

'this is a tuple (1,)' 

trong một số trường hợp ví dụ bạn muốn nhận được một danh sách trích dẫn được sử dụng trong chuỗi truy vấn mysql như

SELECT name FROM students WHERE name IN ('Tom', 'Jerry'); 

bạn cần phải xem xét để loại bỏ các tailing dấu phẩy sử dụng thay thế (')', ')') sau khi định dạng bởi vì nó có thể là tuple chỉ có 1 mục như ('Tom',), do đó tailing dấu phẩy cần phải được loại bỏ:

query_string = 'SELECT name FROM students WHERE name IN {}'.format(t).replace(',)', ')') 

Xin gợi ý nếu bạn có cách phong nha loại bỏ dấu phẩy này trong đầu ra.

+0

Tôi thường thích một thứ như 'đây là một bộ dữ liệu ({})' .format (',' .join (bản đồ (str, t))). Bằng cách đó bạn không phải lo lắng về việc làm rối tung các dấu phẩy hoặc dấu ngoặc đơn hiện có trong chuỗi định dạng. – Antimony

+0

Bạn không nên sử dụng 'format()' trong các truy vấn cơ sở dữ liệu. Có các phương pháp áp dụng cho điều này trong mọi thư viện. – ktalik

+0

@ktalik bạn không hiểu điều này rõ ràng. định dạng() không có gì để làm với các truy vấn cơ sở dữ liệu. format() là hàm chung cho hoạt động chuỗi python. Hãy xem https://docs.python.org/2/library/string.html và bạn sẽ học hỏi từ nó. Không có gì để làm với các truy vấn cơ sở dữ liệu nhớ. –

15

Nhiều câu trả lời được đưa ra ở trên là chính xác. Cách đúng để làm điều đó là:

>>> thetuple = (1, 2, 3) 
>>> print "this is a tuple: %s" % (thetuple,) 
this is a tuple: (1, 2, 3) 

Tuy nhiên, đã có tranh chấp nếu nhà cung cấp chuỗi '%' lỗi thời. Như nhiều người đã chỉ ra, nó chắc chắn không lỗi thời, vì toán tử String '%' dễ kết hợp một câu lệnh String với một dữ liệu danh sách.

Ví dụ:

>>> tup = (1,2,3) 
>>> print "First: %d, Second: %d, Third: %d" % tup 
First: 1, Second: 2, Third: 3 

Tuy nhiên, bằng cách sử dụng .format() chức năng, bạn sẽ kết thúc với một tuyên bố dài dòng.

Ví dụ:

>>> tup = (1,2,3) 
>>> print "First: %d, Second: %d, Third: %d" % tup 
>>> print 'First: {}, Second: {}, Third: {}'.format(1,2,3) 
>>> print 'First: {0[0]}, Second: {0[1]}, Third: {0[2]}'.format(tup) 

First: 1, Second: 2, Third: 3 
First: 1, Second: 2, Third: 3 
First: 1, Second: 2, Third: 3 

Hơn nữa, '%' chuỗi nhà điều hành cũng rất hữu ích đối với chúng tôi để xác nhận kiểu dữ liệu như %s, %d, %i, trong khi .format() only support two conversion flags: '!s''!r'.

+0

Tôi đã chuyển đổi sang sử dụng định dạng() nhưng lợi thế của phương pháp% (có thể định dạng từng phần tử của một bộ tuple và chuyển đổi) là lớn nên tôi nghĩ tôi sẽ quay trở lại. Cảm ơn. – Bill

+0

Bạn cũng có thể chỉ định định dạng cho từng phần tử. Định dạng '{: d} {: s}' (1, '2') – zk82

-4

Talk là giá rẻ, hiển thị cho bạn mã:

>>> tup = (10, 20, 30) 
>>> i = 50 
>>> print '%d  %s'%(i,tup) 
50 (10, 20, 30) 
>>> print '%s'%(tup,) 
(10, 20, 30) 
>>> 
Các vấn đề liên quan