245

プログラムは 2 つの名前を受け取ることになっていて、それらが同じ長さの場合、それらが同じ単語かどうかをチェックする必要があります。同じ単語の場合、「名前は同じです」と出力されます。それらが同じ長さで文字が異なる場合、「The names are different but the same length」と出力されます。私が問題を抱えている部分は、下の 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

どんな提案でも大歓迎です。

4

12 に答える 12

257

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

古いスタイルの書式設定では、書式設定にコードを%使用します。%

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

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

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

古いスタイルのフォーマットでは、タプルを使用して複数の引数を指定する必要があることに注意してください。

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

あなたの場合、{}フォーマット指定子を使用しているため、次を使用し.formatます。

"'{0}' is longer than '{1}'".format(name1, name2)
于 2013-08-05T08:19:49.410 に答える
57

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

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

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

ただし、「%」演算子はおそらく将来廃止される予定です。新しいPEP 3101のやり方は次のようなものです:

"'{0}' is longer than '{1}'".format(name1, name2)
于 2013-08-05T08:31:19.037 に答える
51

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

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

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

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

対象のタプルを唯一の項目、つまり (thetuple,) 部分としてシングルトン タプルを作成することが、ここでの重要なポイントです。

于 2016-05-03T22:14:49.903 に答える
14

私の場合は、%s欠落値の入力が 1 つしか必要ないためです。

于 2017-10-10T07:43:29.320 に答える
6

他の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))
于 2013-11-26T07:27:27.743 に答える
5

Python 3.7 以降では、新しい簡単な方法があります。それはfストリングと呼ばれます。構文は次のとおりです。

name = "Eric"
age = 74
f"Hello, {name}. You are {age}."

出力:

Hello, Eric. You are 74.
于 2019-10-23T13:02:44.473 に答える
3

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

  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))
于 2019-01-07T08:56:44.360 に答える
1

文字列番号を整数に型キャストする最も簡単な方法

number=89
number=int(89)
于 2020-08-01T14:03:27.847 に答える
0

ビュー内のdjango raw 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

ビュー.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 を使用

于 2019-02-26T07:48:35.347 に答える