在python 3中查找匹配项

时间:2017-11-14 15:54:33

标签: python python-3.x

我有两个文件,其中包含大量列和有关一堆对象的不同信息,这些对象带有对象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的列表。

我会在代码中添加什么来查找匹配项?

2 个答案:

答案 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]))