Comparación de caracteres en las cadenas de

Estoy tratando de crear una función que compara los caracteres en la misma posición de las dos cadenas de la misma longitud y devuelve el recuento de sus diferencias.

Por ejemplo,

a = "HORSE"
b = "TIGER"

Y volvería 5 (como todos los personajes en la misma posición son diferentes)

Aquí es lo que he estado trabajando.

def Differences(one, two):
    difference = []
    for i in list(one):
        if list(one)[i] != list(two)[i]:
            difference = difference+1
    return difference

Que da un error de «índices de la Lista deben ser números enteros no strings»

Y así he tratado de convertirlo a int utilizando int(ord(

def Differences(one, two):
    difference = 0
    for i in list(one):
        if int(ord(list(one)[i])) != int(ord(list(two)[i])):
            difference = difference+1
    return difference

Que también devuelve el mismo error.

Cuando me de la lista de impresión(one)[1] != lista(dos)[1] es eithers devuelve True o False, ya que la comparación se ha realizado correctamente.

Me puede decir cómo corregir mi código para este propósito?

  • La razón que usted está recibiendo errores es porque usted está iterando sobre la cadena con la for-loop. En Python, cuando se itera sobre algo (y – como un aparte, no hay necesidad de convertir cadenas a las listas, las cuerdas son iterables por la naturaleza en python) que recibe cada sub elemento en ese punto (en contraposición a un número de índice). Por lo que está recibiendo ["H","O","R","S","E"] como valores «i» en la que for-loop, que obviamente no son índices (es decir, – 0,1,2,3,4).
InformationsquelleAutor Denis Moura | 2016-06-22

10 Kommentare

  1. 4

    Probablemente me acaba de recorrer más de dos de ellos al mismo tiempo con cremallera y una comprensión de lista y, a continuación, tomar la longitud de la lista:

    a='HORSE'
    b='TIGER'
    
    
    words=zip(a,b)
    incorrect=len([c for c,d in words if c!=d])
    print(incorrect)

    Comprimir pares de listas de índice de índice, y se detienen cuando se acabe. Lista de comprensión son los generadores que son básicamente pacto por las declaraciones que usted puede agregar lógica. Así que, básicamente, se lee: para cada comprimido par de letras (c,d) si c!=d, a continuación, poner en la lista (por lo que si las letras son diferentes, hay que aumentar la lista de longitud por 1). A continuación, tomamos la longitud de la lista, que es todas las letras que se posicionalmente diferentes.

    Si tenemos en cuenta que faltan letras diferentes, entonces podemos usar itertools.zip_longest para llenar el resto de la palabra:

    import itertools
    
    a='HORSES'
    b='TIG'
    
    words=itertools.zip_longest(a,b,fillvalue=None)
    incorrect=len([c for c,d in words if c!=d]) ## No changes here
    print(incorrect)

    Obviamente, Ninguno nunca será igual a un personaje, por lo que la diferencia en la duración será registrado.

    EDIT: Esto no ha sido mencionado, pero si queremos caso de insensibilidad, entonces usted acaba de ejecutar .lower() o .casefold() en las cadenas de antemano.

  2. 2

    sum([int(i!=j) for i,j in zip(a,b)]) haría el truco

    • esto es bueno y conciso; sólo un mano a mano a los futuros lectores que esto podría conducir a errores si las entradas son de diferentes longitudes. zip no elevará una Excepción, ya sea
  3. 1

    uso zip para iterar a través de las dos cadenas consecutivamente

    >>> def get_difference(str_a, str_b):
    ...     """
    ...     Traverse two strings of the same length and determine the number of 
    ...     indexes in which the characters differ
    ...     """
    ...
    ...     # confirm inputs are strings
    ...     if not all(isinstance(x, str) for x in (str_a, str_b)):
    ...         raise Exception("`difference` requires str inputs")
    ...     # confirm string lengths match
    ...     if len(str_a) != len(str_b):
    ...         raise Exception("`difference` requires both input strings to be of equal length")
    ...
    ...     # count the differences; this is the important bit
    ...     ret = 0
    ...     for i, j in zip(str_a, str_b):
    ...         if i != j:
    ...             ret += 1
    ...     return ret
    ... 
    >>> difference('HORSE', 'TIGER')
    5

    también, el estilo general es la de minúsculas en los nombres de función (que a menudo son verbos) y el título de la clase de los nombres (que a menudo son sustantivos) 🙂

  4. 0

    Se podría hacer algo como esto:

    def getDifferences(a,b):
      count = 0
    
      for i in range(0, len(a)):
        if a[i] is not b[i]:
          count += 1
    
      return count

    La única cosa que usted tendrá que poner en práctica aquí es comprobar el tamaño de las cadenas. En mi ejemplo, si a es mayor que b, entonces habrá un IndexError.

  5. 0

    intente esto:

    def Differences(one, two):
        if len(two) < len(one):
            one, two = two, one
        res = len(two) - len(one) 
        for i, chr in enumerate(one):
            res += two[i] != chr
        return res

    es importante hacer la primera comprobación de su tamaño en el caso de la segunda cadena es más corta que la primera, así que usted no consigue un IndexError

  6. 0

    Como temas de complejidad y tiempo de ejecución, llamando a lista() en cada iteración no es eficiente, ya que divide las cadenas, asigna memoria y en…
    La forma correcta de hacerlo, es recorrer el índice de las listas, que compararlos, algo como:

    def str_compare(l1, l2):
       assert len(l1) == len(l2) , 'Lists must have the same size'        
       differ_cnt = 0
       for i in xrange(len(l1)):
           if l1[i] != l2[i]:
               differ_cnt += 1
       return differ_cnt
  7. 0

    Hay un par de problemas con:

    def Differences(one, two):
        difference = []
        for i in list(one):
            if list(one)[i] != list(two)[i]:
                difference = difference+1
        return difference

    En primer lugar list(one) es ['H', 'O', 'R', 'S', 'E'] cuando llame Differences(a, b) para que se itera sobre las cuerdas no enteros. Cambiar su código para:

    for i in range(len(one)):

    va a iterar a través de los enteros de 0 a 4 que va a trabajar en su caso, sólo porque a y b tienen la misma longitud (usted necesita para llegar a una mejor solución si usted desea manejar diferentes de la longitud de las entradas).

    En segundo lugar no se puede agregar a una matriz por lo que debe cambiar es ser un int que añadir. El resultado sería:

    def Differences(one, two):
        difference = 0
        for i in range(len(one)):
            if list(one)[i] != list(two)[i]:
                difference = difference+1
        return difference

    Si que estaban super mantener el uso de una matriz sin embargo, puede anexar a una matriz: difference.append(1) y, a continuación, devolver la longitud de la matriz: return len(difference) pero esto sería ineficiente para lo que usted está tratando de lograr.

  8. 0

    Averiguar por ti mismo

    >>> a = "HORSE"
    >>> list(a)
    ['H', 'O', 'R', 'S', 'E']
    >>> list(a)[2]
    'R'
    >>> for i in list(a):
    ...     i
    ...
    'H'
    'O'
    'R'
    'S'
    'E'
    >>> list(a)['R']
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    TypeError: list indices must be integers, not str

    Buena suerte!

  9. 0
    a = "HORSE"
    b = "TIGER"
    a_list=[]
    b_list=[]
    for l in a_list:
        a_list.append(l)
    
    for k in b_list:
        b_list.append(k)
    
    difference = len(a)
    for i in a_list:
        for x in b_list:
            if a_list[i] == b_list[x]:
                difference = difference - 1
    
    print(difference)

    Ver si esto funciona 🙂

  10. 0

    Que es demasiado simple:

    def Differences(one, two):
        difference = 0
        for char1, char2 in zip(one, two):
            if char1 != char2:
                difference += difference
        return difference

Kommentieren Sie den Artikel

Bitte geben Sie Ihren Kommentar ein!
Bitte geben Sie hier Ihren Namen ein

Pruebas en línea