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項目のタプルの場合のコメントを追加しました
Jacob CUI

なぜ%時代遅れであるかは知りませんでしたが、私はstr.formatとにかくいつもあなたを盲目的に廃止しました。単純なものは完全修飾子で{0}はなく、単なる位置インジケータなので、私は完全修飾子が何であるかに興味があります。の場合、int私が完全修飾子と呼ぶのは{0:d}{3:d}たとえば、出力されるintがstr.formatメソッドの4番目の位置にある場合)です。{0:s}修飾子を使用してタプルを印刷しようとしましたが、機能しません。それで、タプルのようなものの完全な修飾子は何ですか?
Ray

1
@レイそれは本当に意味がありません。指定できるオプションはたくさんあります。それらはドキュメントにあります。を使用しstrて何かを印刷したい場合{!s}は、と言うことができますが、これはデフォルトなので、必要ありません。repr代わりに使用したい場合は、行うことができます{!r}。とは異なり、整数について%言う必要はありませんd
アンチモン2016年

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演算子が廃止されているかどうかについては、論争がありました。多くの人が指摘したように、'%'文字列演算子は文字列ステートメントとリストデータを組み合わせる方が簡単なので、これは絶対に時代遅れではありません。

例:

>>> 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一方()のみ2つの変換フラグをサポート'!s'および'!r'


format()の使用に移行しましたが、%メソッド(タプルの各要素をフォーマットして変換できること)のこの利点は大きいので、戻ると思います。ありがとう。
ビル

1
各要素の形式も指定できます。'{:d} {:s}'。format(1、 '2')
zk82

5
「アスタリスクが解凍された」タプルは.format:でうまく機能しますtup = (1,2,3); print('First: {}, Second: {}, Third: {}'.format(*tup))
m-dz 2018

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

(tup,)はタプルを含むタプルであることに注意してください。外側のタプルは%演算子の引数です。内部タプルはその内容であり、実際に印刷されます。

(tup)括弧内の式で、評価されるとになりtupます。

(tup,)末尾のコンマはタプルであり、これにtupはメンバーのみが含まれます。


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

この質問はかなり古く、多くの異なる答えがありますが、私はまだ、私には最も「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でで回避されているように、単一要素のタプルを印刷するときに末尾のコンマを印刷することも回避されreplaceます。(印刷時にタイプ表現を保持したい場合は、末尾のコンマ表現が正しいとしても):

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( t))。

printfスタイルの書式設定に慣れていない場合は、非常に標準的であるため、学習することを強くお勧めします。ほとんどの言語は、何らかの形でそれをサポートしています。


2

タプルに項目が1つしかない場合は、末尾にコンマが追加されることに注意してください。例えば:

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'、)のような1つのアイテムしかない可能性があるため、書式設定後にテーリングコンマを削除することを検討する必要があります(replace( '、)'、 ')')。したがって、テーリングコンマを削除する必要があります。

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

このコンマを出力から削除する適切な方法があるかどうかを提案してください。


1
私は通常「これはタプルです({})」。format( '、' .join(map(str、t)))のようなものを好みます。そうすれば、フォーマット文字列内の既存のコンマや括弧をいじることを心配する必要がありません。
アンチモン2014年

1
format()データベースクエリでは使用しないでください。すべてのライブラリでこれに適用できるメソッドがあります。
ktalik

@ktalikあなたは明らかにこれを理解していません。format()はデータベースクエリとは関係ありません。format()は、Python文字列操作に共通の関数です。見てい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説明しようとしていることに注意してください。タプルに項目が1つしかない場合は、末尾にコンマが追加されます。正しく使用しないとトラブルの原因になります。また、フォーマットは確実にSQLクエリの形成に使用できます。中傷者はどこから来たのですか?
Jacob CUI


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

()内にタプルを1つだけ置くと、タプル自体が作成されます。

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

つまり、上記の印刷ステートメントは次のようになります。print( "値:%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.