搜索两个大文件并删除未显示的值

时间:2016-11-18 14:23:09

标签: python-2.7 dictionary

我有一个查询文件和主题文件。查询文件是制表符分隔表:

id  value
1_A X
1_T Y
2_A Z
2_C AA
2_S B

主题文件是制表符分隔的群集文件:

line1   H_2 1_A
line2   1_T 2_A
line3   2_C H_3
line4   2_S

我的目标是逐行读取主​​题文件,并在查询文件中搜索每个元素的存在。如果在查询文件中找不到该元素,我将删除该元素。例如,我的输出将是:

line1 1_A
line2 1_T   2_A
line3 2_C
line4 2_S

如您所见,在第一行中,查询文件中不存在H_2,因此删除了表单输出列表。

我写了以下代码:

import pandas as pd

query = pd.read_csv('query.txt', sep='\t')
print query
dic = query.set_index('id')['value'].to_dict()
print dic.keys()

new_tmp = []
with open('subject.txt') as sbjt:
    sub = sbjt.readlines()
    for eachline in sub:
        tmp = eachline.strip('\n').split('\t')
        print tmp
        for i in range(1,len(tmp)):
            if tmp[i] in dic.keys():
                new_tmp.append(tmp[0])
                new_tmp.append('\t')
                new_tmp.append(tmp[i])
        new_tmp.append('\n')

print new_tmp
outfile = open('test.txt', 'w')
for item in new_tmp:
    print >> outfile, item

此代码的问题是:

  1. 输出按顺序写入,即一行中的每个元素,而不是代码中指定的。
  2. 示例文件很小,因此运行速度更快。但是,我的真实文件有300k dict.keys和主题文件有35k条目。有没有办法加快替代方案的速度呢?
  3. 提前致谢,

    AP

1 个答案:

答案 0 :(得分:1)

效果问题

if tmp[i] in dic.keys():

有效,但你并没有真正使用字典搜索,特别是在python 2.7中keys()返回一个列表,所以搜索是O(N)(对字典搜索来说要好得多)

相反,更简单,更简单更快:

if tmp[i] in dic:

格式化问题

您为每件商品创建一行。每个元素new_tmp应代表一行,而不是代币。

从您的评论中,您似乎每次都不需要tmp[0](我复制了错误的代码),因此可以使用生成器理解而不是循环来完成,甚至更好(没有创建临时列表)创建线)。

line = "\t".join(c for i,c in enumerate(tmp) if i==0 or c in dic)

(总是拿第一项或者如果是在字典中,避免索引访问,不要创建list():快得多)

总结一下,要创建包含所有项目的1行,请执行以下操作:

tmp = eachline.strip('\n').split('\t')
if tmp:  # list not empty
    # add a line with all matched tmp items separated by \t
    line = "\t".join(c for i,c in enumerate(tmp) if i==0 or c in dic)
    new_tmp.append(line+"\n")