我有一个查询文件和主题文件。查询文件是制表符分隔表:
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
此代码的问题是:
提前致谢,
AP
答案 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")