2016-01-04 3 views
1

У меня есть два текстовых файла. Мне нужно проверить дубликаты слов внутри них. Есть ли способ более сжатый, чем этот код?найти дубликаты слов в двух файлах

file1 = set(line.strip() for line in open('/home/user1/file1.txt')) 
file2 = set(line.strip() for line in open('/home/user1/file2.txt')) 

for line in file1 & file2: 
    if line: 
     print(line) 
+0

На каких языках представлены файлы? И каково ваше определение слова? –

+5

Повторяющиеся слова или строки? –

+0

Эти файлы содержат одно слово в одной строке? –

ответ

0

Это одна строка короче и закрывает оба файла после использования:

with open('/home/user1/file1.txt') as file1, open('/home/user1/file2.txt') as file2: 
    for line in set(line.strip() for line in file1) & set(line.strip() for line in file2): 
     if line: 
      print(line) 

вариационной только один комплект:

with open('/home/user1/file1.txt') as file1, open('/home/user1/file2.txt') as file2: 
    for line in set(line.strip() for line in file1).intersection(line.strip() for line in 
                   file2): 
     if line: 
      print(line) 
+0

Вы можете поместить все это в одну строку, но в чем смысл? На этом сайте мы не играем в гольф. – moooeeeep

+0

Ну, он по-прежнему доступен для чтения, и он улучшает исходный подход, используя инструкцию 'with'. –

0

Еще короче:

with open('/home/user/file1.txt') as file1, open('/home/user/file2.txt') as file2: 
    print "".join([word+"\n" for word in set(file1.read().split()) & set(file2.read().split())]) 
2

You может писать сжатый код, но что более важно Вам не нужно, чтобы создать два набора, вы можете использовать set.intersection, который позволит вашему коду работать для больших наборов данных и работать быстрее:

with open('/home/user1/file1.txt') as f1, open('/home/user1/file2.txt') as f2: 
    for line in set(map(str.rstrip,f2)).intersection(map(str.rstrip,f2))): 
     print(line) 

Для использования python2 itertools.imap:

from itertools import imap 
with open('/home/user1/file1.txt') as f1, open('/home/user1/file2.txt') as f2: 
    for line in set(imap(str.rstrip,f2)).intersection(imap(str.rstrip(f2))): 
     print(line) 

Вы создать один набор, который затем добавляется к итерации по итерируемому переданному, т. е. str.rstripped строк файла2, так как он создает два полных набора строк, а затем выполняет пересечение.

Смежные вопросы