我想找到两个文件之间匹配的字符。在file1.txt
我有red green blue
,file2.txt
我有green gray
,
我想要输出:
green
我已经尝试过了:
searchfile = open("file1.txt", "r")
for line in searchfile:
if "red" in line:
print line
searchfile.close()
但它打印整个文件内容。我怎样才能得到这个输出?
答案 0 :(得分:2)
您询问如何找到两个文件中的字符,但是从您预期的输入和输出看来,您实际上希望两个文件中都存在字,并由一个空间。
set1 = set(open("a.txt").read().split())
set2 = set(open("b.txt").read().split())
print filter(lambda x: x in set1, set2)
打印
['green']
a.txt
包含
red green blue
和b.txt
包含
green gray
如果您不是特别感兴趣的话,请不要读过这里。这是更快 - 而且更漂亮 - 的方法。
由于OP要求采用其他方法,如果您非常非常特别关注时间复杂度,您可以创建一个生成器函数:
whitespace = {' ','\n'}
def word_generator(file_object):
str_list = []
for char in file_object:
if char not in whitespace:
str_list.append(char)
else:
yield "".join(str_list)
del str_list[:]
with open("a.txt") as f1, open("b.txt") as f2:
set1 = set(word_generator(f1.read()))
set2 = set(word_generator(f2.read()))
print filter(lambda x: x in set1, set2)
这样您就不会将文件内容读入字符串,将字符串拆分为列表,然后从列表中构建集合。相反,你是"分裂"即时的字符串,直接将字词提供给集合理解。
成本也较低(尽管非常微不足道),因为您只是将每个角色与空格和换行进行比较。没有任何参数的split
与space, tab, newline, return and formfeed进行比较。就像我说的那样,差别非常微不足道。
<强> [编辑] 强>
虽然我对不同方法的复杂性的推理似乎(至少对我而言)听起来很有效,split
的高效C实现似乎胜过使用生成器的好处:
def split():
set1 = set(open("a.txt").read().split())
set2 = set(open("b.txt").read().split())
lst = filter(lambda x: x in set1, set2)
def generator():
whitespace = {' ','\n'}
def word_generator(file_object):
str_list = []
for char in file_object:
if char not in whitespace:
str_list.append(char)
else:
yield "".join(str_list)
del str_list[:]
with open("a.txt") as f1, open("b.txt") as f2:
set1 = set(word_generator(f1.read()))
set2 = set(word_generator(f2.read()))
lst = filter(lambda x: x in set1, set2)
if __name__ == "__main__":
from timeit import timeit
print timeit("split()", setup="from __main__ import split", number=10000)
print timeit("generator()", setup="from __main__ import generator", number=10000)
以上产量
0.103315830231
0.151041984558
因此(在许多后续运行中的比例几乎相同),所以看起来你应该采用第一种更简单的方法。如何释放,发电机解决方案真的很难看。
如果有人对第一种方法为何更快有不同的看法,我很乐意听到它。
答案 1 :(得分:1)
你应该: