Muy bien, tengo una tarea escolar en la que necesito comparar dos archivos entre sí. Es muy simple, el programa necesita mostrar cosas como todas las palabras únicas en estos dos archivos, ejemplo;

File1: esto es una prueba

File2: esto no es una prueba

Salida: ["Esto", "es", "a", "prueba", "no"]

Esa es la salida que esperaba de este pequeño código:

def unique_words(file_1, file_2):
    unique_words_list = []
    for word in file_1:
        unique_words_list.append(word)
    for word in file_2:
        if word not in file_1:
            unique_words_list.append(word)
    return unique_words_list

Pero eso no sucede, lamentablemente esta es la salida:

['esto \ n', 'es \ n', 'a \ n', 'prueba', 'esto \ n', 'es \ n', 'no \ n', 'a \ n', 'prueba' ]

Tengo varias funciones que funcionan prácticamente de la misma manera y también tienen salidas similares. Sé por qué aparece \ n, aunque no sé cómo deshacerme de él. Si alguien pudiera ayudarme a obtener el resultado correcto con esto, sería de gran ayuda :)

-2
GotYa 7 oct. 2017 a las 18:14

2 respuestas

La mejor respuesta

La solución de Steampunkery es incorrecta: (1) no maneja archivos con> 1 palabra por línea y (2) no tiene en cuenta las palabras repetidas en file1.txt (inténtelo con file1 lines "palabra palabra palabra palabra "- debería obtener una salida de" palabra ", pero obtienes cuatro). Además, la construcción for/if es innecesaria.

Aquí hay una solución compacta y correcta.

Contenido de file1.txt:

the cat and the dog
the lime and the lemon

Contenido de file2.txt:

the mouse and the bunny
dogs really like meat

El código:

def unique(infiles):
    words = set()
    for infile in infiles:
        words.update(set([y for x in [l.strip().split() for l in open(infile, 'r').readlines()] for y in x]))
    return words

print unique(['file1.txt'])
print unique(['file2.txt'])
print unique(['file1.txt', 'file2.txt',])

La salida:

set(['and', 'lemon', 'the', 'lime', 'dog', 'cat'])
set(['and', 'like', 'bunny', 'the', 'really', 'mouse', 'dogs', 'meat'])
set(['and', 'lemon', 'like', 'mouse', 'dog', 'cat', 'bunny', 'the', 'really', 'meat', 'dogs', 'lime'])

Dos lecciones para estudiantes de Python:

  1. Usa las herramientas que te brinda el idioma, como set
  2. Piense en las condiciones de entrada que rompen su algoritmo
1
Chris Johnson 7 oct. 2017 a las 16:51

Aquí hay un pequeño fragmento que escribí reutilizando parte de su código:

#!/usr/bin/env python3.6

with open('file1.txt', 'r') as file1, open('file2.txt', 'r') as file2:
    file_1 = file1.readlines()
    file_1 = [line.rstrip() for line in file_1]
    file_2 = file2.readlines()
    file_2 = [line.rstrip() for line in file_2]


def unique_words(file_1, file_2):
    unique_words_list = file_1
    for word in file_2:
        if word not in unique_words_list:
            unique_words_list.append(word)
    return unique_words_list


print(unique_words(file_1, file_2))

Esta secuencia de comandos asume que tiene 2 archivos llamados file1.txt y file2.txt, respectivamente, en el mismo directorio que la secuencia de comandos. De su ejemplo, también asumimos que cada palabra está en su propia línea. Aquí hay un recorrido:

  1. Abra ambos archivos y lea sus líneas en una lista, eliminando nuevas líneas con una lista de comprensión
  2. Defina una función que agregue todas las palabras en el primer archivo a una lista y luego agregue todas las palabras que no están en esa lista del segundo archivo a la lista
  3. Imprima la salida de esa función usando nuestros archivos que leímos anteriormente como entrada.
0
Steampunkery 7 oct. 2017 a las 15:43