我有两个文件,其中包含大量列和有关一堆对象的不同信息,这些对象带有对象ID。我需要在两个文件之间找到匹配项,但对象ID有两种不同的格式:
一个文件中的12-12-1将被写为0012 00012 1在另一个文件中。例如,在一个文件中我有:0001 01531 1
0001 01535 1
0001 01538 1
另一个对应于此:
1-1531-1
1-1535-1
1-1538-1
像
这样简单matches = open('matches.dat','w')
for j in range(len(file1)):
for i in range(len(file2)):
if file1[j] == file2[i]:
matches.write('{}/n'.format(file1[j]))
似乎没有做到这一点。
file1和file2这里是包含来自不同文件的所有对象ID的列表。
我会在代码中添加什么来查找匹配项?
答案 0 :(得分:1)
import re
def convert(word):
word = word.strip().replace(' ', '-')
return re.sub('\\b0+', '', word) # strip all 0s after a word boundary (space or beginning of line)
您可以通过将两者转换为列表并计算交叉点来计算O(n + m)时间的交点
file1_ids = {convert(line) for line in file1}
file2_ids = {line for line in file2}
matches = file1_ids.intersection(file2_ids)
答案 1 :(得分:0)
一些注意事项:
- 您不要在代码末尾关闭匹配文件。使用with
将自动处理文件清理。
- 您的代码最后一行中的换行符未正确转义 - 它是\n
,而不是/n
。
如果你的数字格式总是不变的(即第一列总是填充到四个值,第二列总是填充到5,而最后一个从不填充),这应该有效:
with open('matches.dat', 'w') as matches:
for j in range(len(file1)):
for i in range(len(file2)):
match_list = file2[i].split('-')
match_str = '{} {} {}'.format(match_list[0].zfill(4), match_list[1].zfill(5), match_list[2])
if file1[j] == match_str:
matches.write('{}\n'.format(file1[j]))