从一组(类似的)字符串中确定前缀

2024-05-23 17:41:23 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一套绳子,例如

my_prefix_what_ever
my_prefix_what_so_ever
my_prefix_doesnt_matter

我只想找到这些字符串中最长的公共部分,这里是前缀。在上面的结果应该是

my_prefix_

my_prefix_what_ever
my_prefix_what_so_ever
my_doesnt_matter

应该产生前缀

my_

Python中是否有一种相对轻松的方法来确定前缀(不必手动遍历每个字符)?

PS:我使用的是Python2.6.3。


Tags: 方法字符串prefixsomy手动字符what
3条回答

Ned Batchelder可能是对的。但有趣的是,这里有一个使用itertoolsphimuemue答案的更有效版本。

import itertools

strings = ['my_prefix_what_ever', 
           'my_prefix_what_so_ever', 
           'my_prefix_doesnt_matter']

def all_same(x):
    return all(x[0] == y for y in x)

char_tuples = itertools.izip(*strings)
prefix_tuples = itertools.takewhile(all_same, char_tuples)
''.join(x[0] for x in prefix_tuples)

作为对可读性的侮辱,这里有一个单行版本:)

>>> from itertools import takewhile, izip
>>> ''.join(c[0] for c in takewhile(lambda x: all(x[0] == y for y in x), izip(*strings)))
'my_prefix_'

我的解决方案是:

a = ["my_prefix_what_ever", "my_prefix_what_so_ever", "my_prefix_doesnt_matter"]

prefix_len = len(a[0])
for x in a[1 : ]:
    prefix_len = min(prefix_len, len(x))
    while not x.startswith(a[0][ : prefix_len]):
        prefix_len -= 1

prefix = a[0][ : prefix_len]

永远不要重写提供给您的内容:^{}这样做正是:

Return the longest path prefix (taken character-by-character) that is a prefix of all paths in list. If list is empty, return the empty string (''). Note that this may return invalid paths because it works a character at a time.

为了与其他答案进行比较,下面是代码:

# Return the longest prefix of all list elements.
def commonprefix(m):
    "Given a list of pathnames, returns the longest common leading component"
    if not m: return ''
    s1 = min(m)
    s2 = max(m)
    for i, c in enumerate(s1):
        if c != s2[i]:
            return s1[:i]
    return s1

相关问题 更多 >