我有一个钥匙清单 ['foo_a','foo_b','foo_c','fnord']
此处所有类似的解决方案都假定fnord
您的文本中没有。
我有这段代码可以完成工作:
def detect_prefix(keys):
PCT = 0.70 # cutof
pre = ''
l = len(keys)
for i in range(0, len(max(keys, key=len))):
keys = filter(lambda k: k.startswith(pre), keys)
cnt = dict()
for k in map(lambda k: k[i], keys):
cnt.setdefault(k,0)
cnt[k] +=1
if cnt[max(cnt)] / float(l) >= PCT:
pre += max(cnt)
else:
break
return pre
我非常怀疑可以更优雅地完成此操作,但是我的python-fu目前不够强大。
我很想听听一些建议。
编辑。其他背景和说明。
这些是其他开发人员放入应用程序中进行翻译的键。它们应该有一个共同的前缀,但是人们会忘记,并且他们从其他代码中剪切并粘贴。“ _”作为前缀分隔符只是一种约定。最好不要假设甚至使用了分隔符。70%是完全任意的阈值。“最流行”或“主要”也将起作用。
是的,这是python 2.7,引号内的空间只是视觉效果。
如果知道公用前缀的所需阈值频率:
#!/usr/bin/env python
from collections import Counter
from itertools import izip_longest
strings = ['foo_a','foo_b','foo_c','fnord']
threshold = .7 * len(strings)
prefix = []
for chars in izip_longest(*strings, fillvalue=''):
char, count = Counter(chars).most_common(1)[0]
if count < threshold:
break
prefix.append(char)
print(''.join(prefix))
# -> foo_
或者,您可以收集所有通用前缀及其频率,然后再决定:
#!/usr/bin/env python
from collections import Counter
from itertools import izip_longest
strings = ['foo_a', 'foo_b','foo_c','fnord']
assert len(strings) > 1
threshold = len(strings)
prefix = []
prefixes = []
for chars in izip_longest(*strings, fillvalue=''):
char, count = Counter(chars).most_common(1)[0]
if count == 1:
break
elif count < threshold:
if prefix:
prefixes.append((''.join(prefix), threshold))
threshold = count
prefix.append(char)
if prefix:
prefixes.append((''.join(prefix), threshold))
print(prefixes)
# -> [('f', 4), ('foo_', 3)]
这两个代码示例均假定存在主要前缀,即,每个位置上最常见的字符都属于最常见的前缀。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句