我试图读取两个文本文件,然后在每个文本文件中搜索两者之间最短长度为5的公用字符串。
我编写的代码:
db = open("list_of_2","r").read()
lp = open("lastpass","r").read()
word = ''
length = 0
for dbchar in db:
for lpchar in lp:
if dbchar == lpchar:
word += str(dbchar)
length += 1
else:
length = 0
word = ''
if length > 4:
print(word)
该代码当前反复打印类似“ -----”和“ 55555”之类的字符串,并且似乎没有中断循环(这些特定的字符串仅在lp
中出现一次)。我也不相信会找到不是只是重复相同字符的字符串。
如何将代码更改为:
编辑:这是一些模拟文本文件。其中,字符串“ ghtyty”在file1中出现3次,在file2中出现4次。该代码应打印一次“ ghtyty”以进行控制台。
答案 0 :(得分:5)
我建议采用另一种方法。将文件拆分为单词,并保留不超过5个字符的单词。使用集来找到交点-这样会更快。
db_words = set([x for x in db.split() if len(x) > 4])
lp_words = set([x for x in lp.split() if len(x) > 4])
matches = db_words & lp_words
如果要排除所有相同字符的单词,则可以这样定义列表理解:
[x for x in db.split() if len(x) > 4 and x != x[0]*len(x)]
如果要查找匹配的字符的任何连续序列,这可能会更好:
i_skip = set() # characters to skip if they are already in a printed word
j_skip = set()
for i in range(len(db)-4):
if i in i_skip: continue
for j in range(len(lp)-4):
if j in j_skip: continue
if db[i] == lp[j]:
word_len = 5
while db[i:i+word_len] == lp[j:j+word_len]:
if db[i:i+word_len+1] == lp[j:j+word_len+1]:
word_len += 1
else:
print(db[i:i+word_len])
i_skip.update(range(i, i+word_len))
j_skip.update(range(j, j+word_len))
break