2013-08-05 3 views
105

プログラムは2つの名前を取り、それらが同じ長さの場合は同じ単語であるかどうかをチェックする必要があります。同じ単語の場合は「名前は同じです」と印刷されます。同じ長さであるが文字が異なる場合、「名前は同じだが同じ長さ」と印刷されます。私が問題を抱えている部分は、下の4行です。私はこのコードを実行するとTypeError:文字列書式中にすべての引数が変換されないpython

#!/usr/bin/env python 
# Enter your code for "What's In (The Length Of) A Name?" here. 
name1 = input("Enter name 1: ") 
name2 = input("Enter name 2: ") 
len(name1) 
len(name2) 
if len(name1) == len(name2): 
    if name1 == name2: 
     print ("The names are the same") 
    else: 
     print ("The names are different, but are the same length") 
    if len(name1) > len(name2): 
     print ("'{0}' is longer than '{1}'"% name1, name2) 
    elif len(name1) < len(name2): 
     print ("'{0}'is longer than '{1}'"% name2, name1) 

は、それが表示されます。

Traceback (most recent call last): 
    File "program.py", line 13, in <module> 
    print ("'{0}' is longer than '{1}'"% name1, name2) 
TypeError: not all arguments converted during string formatting 

任意の提案が高く評価されています。

答えて

132

異なるフォーマット機能を混在させています。

古いスタイル%フォーマットはフォーマットするため%コード使用しています。新しいスタイルの{}フォーマットは古いスタイルの書式を持つこと{}コードと.format方法

'It will cost ${0} dollars.'.format(95) 

注意を使用しています

'It will cost $%d dollars.' % 95 

をタプルを使用して複数の引数を指定する必要があります。

あなたのケースで
'%d days and %d nights' % (40, 40) 

、あなたは{}書式指定子を使用していることから、.formatを使用します。

"'{0}' is longer than '{1}'".format(name1, name2) 
+4

in python 3.6: 'f" 'これは$ {your_variable}ドルの費用がかかります。 " – JinSnow

27

エラーがあなたの文字列フォーマットです。

「%」演算子を使用してフォーマットする伝統的な文字列を使用する正しい方法は、printfスタイルのフォーマット文字列(ここでは、このためのPythonドキュメント:http://docs.python.org/2/library/string.html#format-string-syntax)を:使用することです

"'%s' is longer than '%s'" % (name1, name2) 

しかし、「%」オペレータwill probably be deprecated in the future。物事の新しいPEP 3101方法は、このようなものです。他の2つの答えに加えて

"'{0}' is longer than '{1}'".format(name1, name2) 
+7

scnr:"将来的に廃止される可能性があります "(Python 3.5)古い '%'構文は、[3.1](https://docs.python.org/3.1/whatsnew/3.1.html)で廃止されていませんでした。3.2 [ロギングモジュールは、新しいスタイル '{{ } '](https://docs.python.org/3.2/whatsnew/3.2.html#logging)。そして突然3.5は[PEP 461:バイトのための '%'フォーマット(https://docs.python.org/3.5/whatsnew/3.5.html#pep-461-formatting-support-for-bytes-and-bytearray) 。これは '%'が今後も長い間残っていると思います。 – cfi

+5

'%'はより簡潔です。それは私たちと一緒に残ってうれしい。 –

+1

私は同意します。 %はより簡潔で、削除すると言語にメリットはありません。 – chevydog

2

、私はくぼみも、最後の二つの条件で間違っていると思います。 条件は、一方の名前が他方の名前よりも長く、「elif」で始まり、インデントがないことから始める必要があるという条件です。最初の条件(マージンから4つのインデントを与えることで)に入れると、名前の長さが同じであっても違うこともできないので、矛盾してしまいます。

else: 
     print ("The names are different, but are the same length") 
elif len(name1) > len(name2): 
    print ("{0} is longer than {1}".format(name1, name2)) 
23

私にとって、このエラーは、タプルを文字列フォーマットメソッドに渡そうとしたときに発生しました。

I found the solution from this question/answer

コピーとリンク(NOT MY WORK)から正しい答えを貼り付け:私の場合は

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

Making a singleton tuple with the tuple of interest as the only item, i.e. the (thetuple,) part, is the key bit here.

+0

これはしばしば問題の原因です! –

+0

私はむしろ次のステートメントの1つを使ってタプルを文字列に変換します: '' print ' repr(thetuple)) ' – AlexG

1

私は一つだけ%sを必要とするので、それはだ、私入力値がありません。私もエラーが発生した

+0

ここに同じ問題 – Taylor

0

_mysql_exceptions.ProgrammingError: not all arguments converted during string formatting 

しかし、リストargsがうまく機能します。

私はmysqlclient python libを使用します。 libはタプルargsを受け入れないように見えます。リストの引数を['arg1', 'arg2']のように渡すと動作します。

関連する問題