Python에서 문자열 형식화로 튜플 인쇄


127

그래서이 문제가 있습니다. 문자열 형식으로 인쇄해야하는 튜플 (1,2,3)이 있습니다. 예.

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

그리고 이것은 대괄호로 튜플 표현을 인쇄합니다.

이것은 튜플 (1,2,3)입니다.

그러나 나는 TypeError: not all arguments converted during string formatting대신 얻는다 .

세상에서 어떻게 할 수 있습니까? 여기서 길을 잃었으므로 여러분이 올바른 방향으로 나를 가리킬 수 있다면 :)

답변:


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

관심있는 튜플을 유일한 항목, 즉 (thetuple,)부품 으로 사용하여 싱글 톤 튜플을 만드는 것이 여기서 핵심입니다.


Python 3에서 print는 명령문이 아니라 함수이므로 print(....).
JG

53

점을 유의 %구문이 사용되지 않습니다. str.format더 간단하고 읽기 쉬운를 사용하십시오 .

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

나는이에 코멘트를 추가 stackoverflow.com/a/26249755/1676424 1 개 항목 튜플의 경우에
야곱 CUI에게

%쓸모 없는지 몰랐지만 지금은 항상 당신을 str.format맹목적으로. 단순한 {0}것은 전체 한정자가 아니라 단순히 위치 표시기 이기 때문에 나는 전체 한정자가 무엇인지에 관심이 있습니다. 의 경우 int전체 한정 자라고 부르는 것은 {0:d}(또는 {3:d}예를 들어 인쇄 할 int가 str.format메서드 의 4 번째 위치에서 발생하는 경우 )입니다. {0:s}한정자를 사용하여 튜플을 인쇄하려고 시도했지만 작동하지 않습니다. 그렇다면 튜플과 같은 것에 대한 완전한 한정자는 무엇입니까?
레이

1
@ 레이 정말 말이 안돼. 문서에서 찾을 수있는 지정할 수있는 많은 옵션이 있습니다. 을 사용하여 무언가를 인쇄 str하려면라고 말할 수 {!s}있지만 이것이 기본값이므로 불필요합니다. repr대신 사용하려면 {!r}. 와 달리 정수에 대해 %말할 필요가 없습니다 d.
Antimony

2
나는 새로운 형식보다 내 마음에 덜 장황하기 때문에 % 구문을 좋아하고 또한 내가 알고 사랑하는 c 문자열 형식과 매우 유사합니다.
Paulus

Python 3 %에서도은 완전히 구식이 아닙니다. 사실, 모듈 내에서 구문 pylint을 사용하면 불평 할 것입니다 . stackoverflow.com/a/34634301/534238.formatlogging
Mike Williamson

39

위에 주어진 많은 답변이 정확했습니다. 이를 수행하는 올바른 방법은 다음과 같습니다.

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

그러나 '%'String 연산자가 쓸모가 없는지에 대한 논쟁이있었습니다 . 많은 사람들이 지적했듯이 '%'String 연산자가 String 문을 목록 데이터와 결합하는 것이 더 쉽기 때문에 확실히 쓸모없는 것은 아닙니다 .

예:

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

그러나이 .format()함수를 사용하면 장황한 문장으로 끝납니다.

예:

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

더 나아가, '%'우리가 같은 데이터 유형을 검증하기에 유용 또한 문자열 연산자 %s, %d, %i, .format () 동안 두 변환 플래그를 지원 : '!s''!r'.


나는 format () 사용으로 전환했지만 % 메서드의 이점 (튜플의 각 요소를 포맷하고 변환을 수행 할 수 있다는 것)이 크므로 다시 돌아갈 것이라고 생각합니다. 감사.
Bill

1
각 요소의 형식도 지정할 수 있습니다. '{: d} {: s}'. format (1, '2')
zk82

5
"별표가 풀린"튜플은 .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)
>>>

참고 (tup,)튜플을 포함하는 튜플이다. 외부 튜플은 % 연산자에 대한 인수입니다. 내부 튜플은 실제로 인쇄되는 내용입니다.

(tup)괄호로 묶인 표현식으로, 평가시 tup.

(tup,)뒤에 쉼표가있는 튜플은 tupas is only member를 포함합니다.


9

이것은 문자열 형식을 사용하지 않지만 다음을 수행 할 수 있어야합니다.

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

정말로 문자열 형식을 사용하려면 :

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

3.0 이전의 Python 버전을 사용하고 있다고 가정합니다.


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

이 질문은 꽤 오래되고 다양한 답변이 있지만 여전히 imho 가장 "pythonic"이고 읽기 쉽고 간결한 답변을 추가하고 싶습니다.

일반적인 tuple인쇄 방법은 이미 Antimony에서 올바르게 표시되었으므로 Fong Kah Chun이 올바르게 표시했듯이 튜플의 각 요소를 개별적으로 인쇄하기위한 추가 사항입니다.%s 구문으로 .

흥미롭게도 주석에서만 언급되었지만 별표 연산자를 사용하여 튜플을 풀면 튜플 요소를 개별적으로 인쇄 할 때str.format 메서드를 사용하여 완전한 유연성과 가독성을 얻을 수 있습니다.

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

또한 Jacob CUI가 .NET을 사용하여 회피 한 것처럼 단일 요소 튜플을 인쇄 할 때 후행 쉼표가 인쇄되는 것을 방지 replace합니다. ( 인쇄 할 때 유형 표시를 유지하려는 경우 imho 후행 쉼표 표시가 정확 하더라도 ) :

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

5

이를 수행하는 가장 좋은 방법은 다음과 같습니다.

t = (1,2,3)

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

당신이 익숙하다면 printf에 스타일 형식에 하다면 Python은 자체 버전을 지원합니다. Python에서는 문자열에 적용된 "%"연산자 (모듈로 연산자의 오버로드)를 사용하여 수행합니다.이 연산자는 모든 문자열을 가져와 여기에 printf 스타일 형식을 적용합니다.

우리의 경우에는 "This is a tuple :"을 출력하고 "% s"문자열을 추가하고 실제 문자열의 경우 튜플의 문자열 표현을 전달합니다 (str (을 호출하여). 티)).

printf 스타일 서식에 익숙하지 않다면 매우 표준 적이므로 배우는 것이 좋습니다. 대부분의 언어는 어떤 식 으로든 지원합니다.


2

튜플에 항목이 하나만있는 경우 후행 쉼표가 추가됩니다. 예 :

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

그리고 당신은 얻을 것이다 :

'this is a tuple (1,)'

어떤 경우에는 예를 들어 mysql 쿼리 문자열에서 사용할 인용 목록을 얻고 싶습니다.

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

튜플에 ( 'Tom',)과 같은 항목이 하나만있을 수 있으므로 꼬리 쉼표를 제거해야하므로 서식 지정 후 replace ( ',)', ')')를 사용하여 꼬리 쉼표를 제거하는 것을 고려해야합니다.

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

출력 에서이 쉼표를 제거하는 적절한 방법이 있는지 제안하십시오.


1
저는 보통 'this is a tuple ({})'. format ( ','.join (map (str, t))) 같은 것을 선호합니다. 이렇게하면 형식 문자열에서 기존 쉼표 나 괄호를 엉망으로 만드는 것에 대해 걱정할 필요가 없습니다.
Antimony

1
format()데이터베이스 쿼리에 사용하면 안됩니다 . 모든 라이브러리에 적용 가능한 방법이 있습니다.
ktalik

@ktalik 당신은 이것을 분명히 이해하지 못합니다. format ()은 데이터베이스 쿼리와 관련이 없습니다. format ()은 파이썬 문자열 작업에 대한 일반적인 함수입니다. docs.python.org/2/library/string.html을 살펴보면 배울 수 있습니다. 데이터베이스 쿼리와 관련하여 기억할 것은 없습니다.
Jacob CUI

format()사용자로부터 수집 된 값과 함께 사용하면 SQL 주입이 발생할 수 있습니다. 입력 값을 쿼리에 넣기 전에 유효성을 검사하는 것이 더 안전합니다. 자세한 정보는 다음 지침을 참조하십시오. dev.mysql.com/doc/connector-python/en/… 매개 변수 값을 데이터베이스 유형 문자열 표현으로 캐스팅 한 다음 쿼리 문자열에 붙여 넣을 수도 있습니다. initd.org/psycopg/docs/usage.html 에서 %연산자 가있는 반례와 execute()쿼리 매개 변수가 메소드 인수에서 전달되는 메소드가 있는 솔루션 이있는 것을 살펴보십시오 .
ktalik

1
@Paul Rooney 설명하려고합니다. 튜플에 항목이 하나만 있으면 뒤에 쉼표가 추가됩니다. 그리고 올바르게 사용하지 않으면 문제가 발생할 수 있습니다. 또한 형식은 SQL 쿼리를 형성하는 데 사용할 수 있습니다. 비방하는 사람들은 어디에서 왔습니까 ??
Jacob CUI

2

다른 답변에서 제안 된 방법 외에도 Python 3.6 이후로 Literal String Interpolation (f-strings) 을 사용할 수도 있습니다 .

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

0

답을 얻으려면 이것을 시도하십시오.

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

() 안에 튜플을 하나만 넣으면 튜플이 만들어집니다.

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

이것은 위의 print 문이 다음과 같이 보일 것임을 의미합니다. print ( "Value : % s"% ( '1', '2')) 오류입니다!

그 후:

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

위의 내용은 인쇄물의 인수에 올바르게 공급됩니다.



0

이것도 시도해 볼 수 있습니다.

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

튜플을 사용한 패킹 및 언 패킹 개념 때문에 %something와 함께 사용할 수 없습니다 (tup).


-5

토크는 저렴합니다. 코드를 보여주세요.

>>> tup = (10, 20, 30)
>>> i = 50
>>> print '%d      %s'%(i,tup)
50  (10, 20, 30)
>>> print '%s'%(tup,)
(10, 20, 30)
>>> 
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.