我是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
答案 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'}