如何从文件中读取文本,识别相邻的重复单词,并在文本文件中报告其位置?

时间:2017-03-29 14:25:25

标签: python

我正在尝试从文本文件中读取引文,并找到彼此相邻的任何重复单词。以下是引用:

"He that would make his own liberty liberty secure,

must guard even his enemy from oppression;

for for if he violates this duty, he

he establishes a precedent that will reach to himself."
-- Thomas Paine

输出应如下:

找到第1行的“自由”字样

在第3行找到了单词:“for”

在第4行发现了一句话:“他”

我已经编写了从文件中读取文本的代码,但我无法使用代码来识别重复项。我已经尝试枚举文件中的每个单词,并检查一个索引处的单词是否等于以下索引处的单词。但是,我收到索引错误,因为循环继续在索引范围之外。这是我到目前为止所提出的:

import string
file_str = input("Enter file name: ")
input_file = open(file_str, 'r')

word_list = []
duplicates = []

for line in input_file:
    line_list = line_str.split()
    for word in line_list:
        if word != "--":
            word_list.append(word)

for idx, word in enumerate(word_list):
    print(idx, word)
    if word_list[idx] == word_list[idx + 1]:
        duplicates.append(word)

对我正在尝试的当前方法的任何帮助将不胜感激,或建议另一种方法。

3 个答案:

答案 0 :(得分:1)

当您录制word_list时,您将丢失有关该单词所在行的信息。

或许更好的方法是在阅读行时确定重复项。

line_number = 1
for line in input_file:
    line_list = line_str.split()
    previous_word = None
    for word in line_list:
        if word != "--":
            word_list.append(word)
        if word == previous_word:
            duplicates.append([word, line_number])
        previous_word = word
    line_number += 1

答案 1 :(得分:0)

这应该做的技巧OP。在单词列表中的for循环中,它现在只到达倒数第二个元素。这不会跟踪行数,但我会使用Phillip Martin的解决方案。

import string

file_str = input("Enter file name: ")
input_file = open(file_str, 'r')

word_list = []
duplicates = []

for line in input_file:
    line_list = line.split()
    for word in line_list:
        if word != "--":
            word_list.append(word)
#Here is the change I made         >     <
for idx, word in enumerate(word_list[:-1]):
    print(idx, word)
    if word_list[idx] == word_list[idx + 1]:
        duplicates.append(word)
print duplicates

答案 2 :(得分:0)

这是另一种方法。

from itertools import tee, izip
from collections import defaultdict

dups = defaultdict(set)
with open('file.txt') as f:
    for no, line in enumerate(f, 1):
        it1, it2 = tee(line.split())
        next(it2, None)
        for word, follower in izip(it1, it2):
            if word != '--' and word == follower:
                dups[no].add(word)

产生

>>> dups
defaultdict(<type 'set'>, {1: set(['liberty']), 3: set(['for'])})

这是一个字典,它为每一行保存一组配对重复,例如

>>> dups[3]
set(['for'])

(我不知道你为什么期望在第四行找到“他”,你的样本文件肯定不会加倍。)