Estoy tratando de escribir un código para algo como se describe a continuación, pero cuando intento usarlo, el shell devuelve un mensaje (ver abajo) que dice que no puedo usar! = Porque los índices de lista deben ser enteros o sectores, no str, pero cuando hago algo como ['a']! = ['b'] o ['a', 'c']! = ['a', 'c'] en el shell, funciona (primero devuelve verdadero y segundo devuelve falso) y esas son listas de cadenas, así que no estoy completamente seguro de cuál es el problema. ¿Quizás la forma en que estoy escribiendo el código lo hace incorrecto o no necesito usarlo todo?

¿Por qué recibo un error y hay alternativas a! = O debería reescribir mi código? (Si mi código parece estar completamente apagado, puede ser, soy un principiante y traté de construirlo por mi cuenta, creo / espero ir en la dirección correcta)

Código:

 def remove_match(list1, list2):
'''(list, list) -> list
Given two lists of a single character strings, return a new list
that contains only the characters in list1 that were not the same string
and in the same position in list 2. Both list1 and list2 
have the same length.
>>>remove_match(['P', 'O', 'Y', 'R'], ['P', 'B', 'G', 'R'])
['O', 'Y']
>>>remove_match(['P', 'G', 'G', 'R'], ['P', 'G', 'G', 'R'])
[]
>>>remove_match(['O', 'R', 'B', 'Y'], ['P', 'P', 'P', 'P'])
['O', 'R', 'B', 'Y']
'''
edit_list1=[]
for i in list1:
    if list1[i] != list2[i]:
        edit_list1.append(list1[i])
return edit_list1

El mensaje que aparece cuando intento usar la función (como uno de los ejemplos de cadenas de documentos) es:

  Traceback (most recent call last):
  Python Shell, prompt 2, line 1
  File "/Users/Rir/Desktop/folder/file.py", line 56, in <module>
    if list1[i] != list2[i]:
 builtins.TypeError: list indices must be integers or slices, not str

¡Gracias!

0
Rir8 28 oct. 2017 a las 07:06

4 respuestas

La mejor respuesta

i in list1 corresponde a un valor, no a un índice.

Lo que realmente quieres hacer es probablemente:

edit_list1=[]
for i in list1:
    if i != list2[list1.index(i)]:
        edit_list1.append(i)
return edit_list1
0
Nae 28 oct. 2017 a las 04:13

Dado que ambas listas son del mismo tamaño, puede usar enumerate() -

def remove_match(list1, list2):
  edit_list1=[]
  for idx, i in enumerate(list1):
    if i != list2[idx]:
      edit_list1.append(i)
  return edit_list1

print(remove_match(['P', 'O', 'Y', 'R'], ['P', 'B', 'G', 'R']))
print(remove_match(['P', 'G', 'G', 'R'], ['P', 'G', 'G', 'R']))
print(remove_match(['O', 'R', 'B', 'Y'], ['P', 'P', 'P', 'P']))

Salida -

['O', 'Y']
[]
['O', 'R', 'B', 'Y']

El mismo código usando List Comprehension -

def remove_match(list1, list2):
  return [i for idx, i in enumerate(list1) if i != list2[idx]]
0
Manish Giri 28 oct. 2017 a las 04:18

Probablemente querías un índice entero incremental i

def remove_match(list1, list2):
    edit_list1=[]
    for i in range(len(list1)):  # get indices from range the length of your list
        if list1[i] != list2[i]:
            edit_list1.append(list1[i])
    return edit_list1   

zip() es bueno para operaciones "paralelas" en listas:

def remove_match(list1, list2):
    edit_list1=[]
    for a, b in zip(list1, list2):  # zip lists together, get elements in pairs
        if a != b:                  # test on the paired elements, no indexing
            edit_list1.append(a)
    return edit_list1

Y como se muestra en otras respuestas, el bucle coincide con el patrón de comprensión de la lista

def remove_match(list1, list2):
    return [a for a, b in zip(list1, list2) if a != b]  
1
f5r5e5d 28 oct. 2017 a las 04:37

En primer lugar, los índices de lista deben ser enteros. Puede usar enumerate () para obtener el índice y el contenido al mismo tiempo. Luego ejecútalo a través del bucle.

Sin embargo, le sugiero que use la comprensión de la lista.

list1 = ['P', 'O', 'Q', 'Y']
list2 = ['P', 'O', 'Q', 'A']

list_nomatch = [x for x in list1 if x not in list2]

Esto producirá 'Y'. Espero que ayude

2
ajenie 28 oct. 2017 a las 04:30