In tuple với định dạng chuỗi trong Python


126

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ụ.

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

và điều này sẽ 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 formattingthay thế.

Làm thế nào trên thế giới tôi có thể làm điều này? Kinda bị mất ở đây vì vậy nếu các bạn có thể chỉ cho tôi một hướng đi đúng :)

Câu trả lời:


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

Tạo một bộ dữ liệu đơn lẻ với bộ dữ liệu quan tâm là mục duy nhất, tức là (thetuple,)phần, là bit chính ở đây.


Trong Python 3 print là một hàm, không phải là một câu lệnh, vì vậy bạn phải viết print(....).
JG

53

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

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

Tôi đã thêm một nhận xét cho stackoverflow.com/a/26249755/1676424 cho trường hợp của 1 mục tuple
Jacob CUI

Tôi không bao giờ biết tại sao %là lỗi thời nhưng tôi luôn luôn là bạn str.format, dù mù quáng. Mặc dù vậy, tôi quan tâm đến vòng loại đầy đủ là gì, bởi vì đơn giản {0}không phải là vòng loại đầy đủ, mà chỉ là một chỉ báo vị trí. Đối với một int, cái mà tôi gọi là vòng loại đầy đủ sẽ là {0:d}(hoặc {3:d}ví dụ, nếu int được in xảy ra ở vị trí thứ 4 trong str.formatphươ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ì vậy, những gì đủ điều kiện cho một cái gì đó như một tuple?
Ray

1
@Ray Điều đó không thực sự có ý nghĩa. 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 strbạn có thể nói {!s}, nhưng đây là mặc định, vì vậy nó không cần thiết. Nếu bạn muốn sử dụng reprthay thế, bạn có thể làm {!r}. Không giống như với %, không cần phải nói dcho số nguyên.
Antimon

2
Tôi thuộc loại cú pháp thích% vì nó ít dài dòng hơn so với định dạng mới và cũng rất giống với định dạng chuỗi c mà tôi biết và yêu thích
Paulus

Lưu ý rằng, ngay cả trên Python 3, %nó không hoàn toàn lỗi thời. Trên thực tế, pylintthậm chí sẽ phàn nàn nếu bạn sử dụng .formatcú pháp trong loggingmô-đun: stackoverflow.com/a/34634602/534238
Mike Williamson

39

Nhiều câu trả lời ở trên là chính xác. Cách đúng đắn để 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 về việc '%'toán tử String đã lỗi thời. Như nhiều người đã chỉ ra, nó chắc chắn không bị lỗi thời, vì '%'toán tử String dễ dàng kết hợp một câu lệnh String với dữ liệu danh sách.

Thí 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()hàm, bạn sẽ kết thúc bằng một câu lệnh dài dòng.

Thí 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 () chỉ hỗ trợ hai cờ chuyển đổi : '!s''!r'.


Tôi đã thực hiện chuyển đổi sang sử dụng định dạng () nhưng lợi thế này của phương thức% (có thể định dạng từng phần tử của một tuple và thực hiện chuyển đổi) là rất lớn nên tôi nghĩ tôi sẽ quay lại. Cảm ơn.
Bill

1
Bạn có thể chỉ định định dạng cho từng yếu tố. Định dạng '{: d} {: s}'. (1, '2')
zk82

5
Bộ đệm "dấu hoa thị" đã hoạt động tốt với .format: tup = (1,2,3); print('First: {}, Second: {}, Third: {}'.format(*tup)).
m-dz

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

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

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

(tup,)với dấu phẩy là một tuple, chỉ chứa tupthành viên.


9

Điều này không sử dụng định dạng chuỗi, 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 định dạng chuỗi:

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ả sử bạn đang sử dụng phiên bản Python sớm hơn 3.0.


7
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)

6

Mặc dù câu hỏi này khá cũ và có nhiều câu trả lời khác nhau, tôi vẫn muốn thêm câu trả lời "pythonic" nhất và cũng có thể đọc / ngắn gọn.

tuplephương pháp in chung đã được Antimony hiển thị chính xác, đây là một bổ sung để in riêng từng phần tử trong một tuple, vì Fong Kah Chun đã hiển thị chính xác với %scú pháp.

Điều thú vị là nó chỉ được đề cập trong một bình luận, nhưng sử dụng toán tử dấu hoa thị để giải nén bộ dữ liệu mang lại sự linh hoạt và dễ đọc hoàn toàn bằng cách sử dụng str.formatphương pháp khi in riêng các phần tử .

tup = (1, 2, 3)
print('Element(s) of the tuple: One {0}, two {1}, three {2}'.format(*tup))

Điều này cũng tránh in dấu phẩy khi in một bộ phần tử đơn, như được Jacob CUI phá vỡ bằng replace. (Mặc dù imho, biểu diễn dấu phẩy là chính xác nếu muốn giữ nguyên cách biểu diễn khi in ):

tup = (1, )
print('Element(s) of the tuple: One {0}'.format(*tup))

5

Tôi nghĩ 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 định dạng kiểu printf , thì Python hỗ trợ phiên bản của chính nó. 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 (quá tải của toán tử modulo), 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 bảo nó in "Đây là một tuple:", sau đó thêm một chuỗi "% s", và đối với chuỗi thực tế, chúng tôi chuyển qua một chuỗi đại diện của tuple (bằng cách gọi str (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 học, vì nó rất chuẩn. Hầu hết các ngôn ngữ hỗ trợ nó theo cách này hay cách khác.


2

Xin lưu ý dấu phẩy sẽ được thêm vào nếu bộ dữ liệu 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 có một danh sách được trích dẫn sẽ đượ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 xem xét để xóa dấu phẩy đuôi sử dụng thay thế (',)', ')') sau khi định dạng vì có thể bộ tuple chỉ có 1 mục như ('Tom',), vì vậy dấu phẩy đuôi cần phải được xóa:

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

Vui lòng đề xuất nếu bạn có cách tốt để loại bỏ dấu phẩy này trong đầu ra.


1
Tôi thường thích một cái gì đó như 'đây là một tuple ({})'. Format (',' .join (map (str, t))). Bằng cách đó, bạn không phải lo lắng về việc làm rối với dấu phẩy hoặc dấu ngoặc đơn hiện có trong chuỗi định dạng.
Antimon

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

@ktalik bạn không hiểu điều này rõ ràng. format () không liên quan gì đến các truy vấn cơ sở dữ liệu. format () là hàm phổ biến cho hoạt động chuỗi python. Hãy xem docs.python.org/2/l Library / chuỗi.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ớ.
Jacob CUI

Sử dụng format()với các giá trị được thu thập từ người dùng có thể dẫn đến việc tiêm SQL. Sẽ an toàn hơn khi xác thực các giá trị đầu vào trước khi đưa chúng vào truy vấn. Xem các hướng dẫn này để biết thêm thông tin: dev.mysql.com/doc/connector-python/en/, Bạn cũng có thể truyền các giá trị tham số cho biểu diễn chuỗi loại cơ sở dữ liệu và sau đó dán nó vào chuỗi truy vấn. Hãy xem initd.org/psycopg/docs/usage.html nơi bạn có một ví dụ mẫu với %toán tử và một giải pháp với execute()phương thức trong đó các tham số truy vấn đang được truyền trong phương thức args.
ktalik

1
@Paul Rooney Xin lưu ý Tôi đang cố gắng giải thích, dấu phẩy sẽ được thêm vào nếu bộ dữ liệu chỉ có một mục. VÀ nó sẽ gây rắc rối nếu không sử dụng đúng cách. Ngoài ra định dạng chắc chắn có thể được sử dụng để hình thành các truy vấn SQL. Những kẻ gièm pha đến từ đâu ??
Jacob CUI

2

Bên cạnh các phương thức được đề xuất trong các câu trả lời khác, vì Python 3.6, bạn cũng có thể sử dụng Nội suy chuỗi ký tự (chuỗi f):

>>> tup = (1,2,3)
>>> print(f'this is a tuple {tup}')
this is a tuple (1, 2, 3)

0

Hãy thử điều này để có câu trả lời:

>>>d = ('1', '2') 
>>> print("Value: %s" %(d))
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: not all arguments converted during string formatting

Nếu chúng ta chỉ đặt một tuple bên trong (), nó sẽ tự tạo một tuple:

>>> (d)
('1', '2')

Điều này có nghĩa là câu lệnh in ở trên sẽ giống như: print ("Giá trị:% s"% ('1', '2')) là một lỗi!

Vì thế:

>>> (d,)
(('1', '2'),)
>>> 

Ở trên sẽ được cung cấp chính xác cho các đối số của bản in.



0

Bạn có thể thử cái này là tốt;

tup = (1,2,3)
print("this is a tuple {something}".format(something=tup))

Bạn không thể sử dụng %somethingvới (tup)chỉ vì đóng gói và giải nén khái niệm với tuple.


-5

Nói là rẻ, cho bạn xem mã:

>>> tup = (10, 20, 30)
>>> i = 50
>>> print '%d      %s'%(i,tup)
50  (10, 20, 30)
>>> print '%s'%(tup,)
(10, 20, 30)
>>> 
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.