从文件中提取多个最长的公共前缀

时间:2019-06-18 10:42:46

标签: python python-3.x

我是python的新手,陷入了一个问题,要从文件中获取最长的公共前缀。我在网络上找到了获取2个字符串之间的通用前缀的解决方案,但无法从文件中获取任何解决方案

下面的程序返回9,而我想要的输出是9415007和95420070144。

fname = 'Book1 - Copy.csv'
fh = open(fname)
file2 = fh.read()

a = list(file2.split())
prefix_len = len(a[0])
count = 0
lst = list()

for x in a:
    prefix_len = min(prefix_len, len(x))

    while not x.startswith(a[0][: prefix_len]):
        prefix_len = prefix_len-1

prefix = a[0][: prefix_len]
print(prefix)

我希望输出为9415007和954200701441。

样本数据:

9415007301578
9415007301585
9415007014416
9542007014416
9542007014417
9542007014418

2 个答案:

答案 0 :(得分:0)

我敢肯定,这不是最好的解决方案,但绝对是最简单的解决方案。

data = """9415007301578
9415007301585
9415007014416
9542007014416
9542007014417
9542007014418""".splitlines()

longest_prefix = ""
for i in range(len(data) - 1):
    temp_prefix = ""
    for j in range(min(len(data[i]), len(data[i+1]))):
        if data[i][j] == data[i + 1][j]:
            temp_prefix += data[i][j]
        else:
            break
    if len(temp_prefix) > len(longest_prefix):
        longest_prefix = temp_prefix

print(longest_prefix)

输出:

954200701441

答案 1 :(得分:0)

os.path模块包含您可以使用的commonprefix函数。要找到任意两行之间的最长前缀,您应该首先对这两行进行排序,然后比较连续的对(保持最长)。

例如:

from os.path import commonprefix
sLines  = sorted(lines)
longest = max((commonprefix([a,b]) for a,b in zip(sLines,sLines[1:])),key=len)
common  = commonprefix(lines)
print(common,longest) # 9, 954200701441

请注意,由于存在94 ...和95 ...的实例,因此示例数据的所有行仅具有“ 9”作为通用前缀,要获取9415007,您需要删除最后4行

如果您需要按公司对公司进行此操作,则需要按公司标识符(前7个字符)对数据进行分组:

from collections import defaultdict
companies = next( d for d in [defaultdict(list)] if [d[s[:7]].append(s) for s in lines])
companies = {c:sorted(s) for c,s in companies.items()}
companies = {c:max((commonprefix([a,b]) for a,b in zip(s,s[1:])),key=len) for c,s in companies.items()}

print(companies) # {'9415007': '94150073015', '9542007': '954200701441'}