print - TypeError: no todos los argumentos convertidos durante el formato de cadenas python



reemplazar caracteres en python (4)

Se supone que el programa debe incluir dos nombres, y si tienen la misma longitud, debe verificar si son la misma palabra. Si es la misma palabra, se imprimirá "Los nombres son los mismos" . Si tienen la misma longitud pero con letras diferentes, se imprimirá "Los nombres son diferentes pero tienen la misma longitud" . La parte con la que tengo un problema está en las últimas 4 líneas.

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

Cuando ejecuto este código, aparece:

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

Cualquier sugerencia es altamente apreciada.

https://src-bin.com


Answer #1

Además de las otras dos respuestas, creo que las sangrías también son incorrectas en las dos últimas condiciones. Las condiciones son que un nombre es más largo que el otro y deben comenzar con 'elif' y sin sangrías. Si lo pones dentro de la primera condición (dándole cuatro indentaciones desde el margen), termina siendo contradictorio porque las longitudes de los nombres no pueden ser iguales y diferentes al mismo tiempo.

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

Answer #2

El error está en tu formateo de cadena.

La forma correcta de utilizar el formato de cadena tradicional con el operador '%' es utilizar una cadena de formato estilo printf (la documentación de Python para esto aquí: http://docs.python.org/2/library/string.html#format-string-syntax ):

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

Sin embargo, el operador '%' probablemente se desaprovechará en el futuro . La nueva forma de hacer PEP 3101 es así:

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

Answer #3

Estás mezclando diferentes funciones de formato.

El formato de % estilo antiguo usa % códigos para formatear:

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

El formato de estilo nuevo {} usa códigos {} y el método .format

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

Tenga en cuenta que con el formateo de estilo antiguo, debe especificar múltiples argumentos usando una tupla:

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

En su caso, dado que está utilizando {} especificadores de formato, use .format :

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

Answer #4

Para mí, este error fue causado cuando estaba tratando de pasar una tupla en el método de formato de cadena.

Encontré la solución de esta pregunta / respuesta

Copiando y pegando la respuesta correcta del enlace (NO ES MI TRABAJO) :

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

Hacer una tupla singleton con la tupla de interés como el único elemento, es decir, la parte (thetuple,), es la clave aquí.





output-formatting