web-dev-qa-db-ja.com

TypeError:Pythonの文字列フォーマット中に全ての引数が変換されるわけではありません

プログラムは2つの名前を取り入れることになっています、そして、それらが同じ長さであれば、それらが同じWordであるかどうかをチェックするべきです。同じWordであれば "名前は同じです" と表示されます。それらが同じ長さであるが異なる文字であるならば、それは印刷するでしょう "名前は異なるが同じ長さである" 。私が問題を抱えている部分は下の4行にあります。

#!/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

任意の提案は大歓迎です。

158
user2652300

あなたはさまざまなフォーマット関数を混在させています。

古いスタイルの%フォーマットはフォーマットに%コードを使います:

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

新しいスタイルの{}フォーマットは{}コードと.formatメソッドを使います

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

古いスタイルのフォーマットでは、Tupleを使って複数の引数を指定しなければならないことに注意してください。

'%d days and %d nights' % (40, 40)

あなたの場合は{}フォーマット指定子を使っているので、.formatを使います:

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

エラーは文字列のフォーマットにあります。

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

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

しかし、 '%'演算子 はおそらく将来非推奨になるでしょう 。新しい PEP 3101 のやり方は次のとおりです。

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

私にとっては、このエラーは私がTupleを文字列フォーマットメソッドに渡そうとした時に起こりました。

この質問から答えを見つけました/回答

リンクから正しい答えをコピーして貼り付ける (NOT MY WORK)

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

関心のあるタプルを唯一の項目、すなわち(thetuple)部分としてシングルトンタプルを作ることがここでの重要なポイントです。

40
Nick Brady

私の場合は、%sが1つだけ必要なため、値の入力がありません。

7

他の2つの答えに加えて、私は字下げも最後の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))
5
GuyP

他のいくつかの答えで指摘されているように問題の組み合わせがあります。

  1. Nneonneoが指摘しているように、あなたは異なる文字列フォーマット方法を混ぜています。
  2. GuyPが指摘したように、あなたのインデントもまたオフになっています。

.formatの例と%sの引数指定子にタプルを渡す方法の両方を提供しました。どちらの場合も、長さが一致する場合のチェック数の外側/外側のインデントは非常に大きい/小さいです。また、後続のif文をElifのものに変更したため、前の同じレベルの文がFalseの場合にのみ実行されます。

.formatによる文字列フォーマット

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")
Elif len(name1) > len(name2):
    print ("{0} is longer than {1}".format(name1, name2))
Elif len(name1) < len(name2):
    print ("{0} is longer than {1}".format(name2, name1))

%sとタプルを使った文字列フォーマット

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")
Elif len(name1) > len(name2):
    print ("%s is longer than %s" % (name1, name2))
Elif len(name1) < len(name2):
    print ("%s is longer than %s" % (name2, name1))
2
Trevor Benson

Djangoの生SQLクエリビュー

"SELECT * FROM VendorReport_vehicledamage WHERE requestdate BETWEEN '{0}' AND '{1}'".format(date_from, date_to)

models.py

class VehicleDamage(models.Model):
    requestdate = models.DateTimeField("requestdate")
    vendor_name = models.CharField("vendor_name", max_length=50)
    class Meta:
        managed=False

views.py

def location_damageReports(request):
    #static date for testing
    date_from = '2019-11-01'
    date_to = '2019-21-01'
    vehicle_damage_reports = VehicleDamage.objects.raw("SELECT * FROM VendorReport_vehicledamage WHERE requestdate BETWEEN '{0}' AND '{1}'".format(date_from, date_to))
    damage_report = DashboardDamageReportSerializer(vehicle_damage_reports, many=True)
    data={"data": damage_report.data}
    return HttpResponse(json.dumps(data), content_type="application/json")

注:python 3.5とDjango 1.11を使う

0
Vinay Kumar

私もエラーに遭遇します、

_mysql_exceptions.ProgrammingError: not all arguments converted during string formatting 

しかし、リスト引数はうまく機能します。

私はmysqlclient python libを使用しています。ライブラリはタプル引数を受け付けないようです。 ['arg1', 'arg2']のようなリスト引数を渡すことはうまくいきます。

0
Victor Choy