如何获取列表中字符串的公共前缀[重复]

Posted

技术标签:

【中文标题】如何获取列表中字符串的公共前缀[重复]【英文标题】:How to get common prefix of strings in a list [duplicate] 【发布时间】:2020-05-14 02:18:20 【问题描述】:

我需要知道如何识别列表中字符串中的前缀。例如,

list = ['nomad', 'normal', 'nonstop', 'noob']

它的答案应该是“否”,因为列表中的每个字符串都以“否”开头

我想知道是否有一种方法可以同时迭代列表中字符串中的每个字母并检查每个字母是否相同。

【问题讨论】:

你的意思是最长的常用词吗? 每个字符串开头的最长常用词 谷歌搜索longest common prefix python 可能会有所帮助(如果您是这个意思)。 那么输出应该是 False 所以如果列表有 ['string, 'strawberry', 'start'],那么它应该返回 'st' 【参考方案1】:

使用os.path.commonprefix,它将完全按照您的意愿行事。

In [1]: list = ['nomad', 'normal', 'nonstop', 'noob']

In [2]: import os.path as p

In [3]: p.commonprefix(list)
Out[3]: 'no'

顺便说一句,将列表命名为“列表”会导致无法访问 list 类,因此我建议使用不同的变量名。

【讨论】:

【参考方案2】:

这是一个没有库的代码:

for i in range(len(l[0])):
    if False in [l[0][:i] == j[:i] for j in l]:
        print(l[0][:i-1])
        break

给出输出:

no

【讨论】:

【参考方案3】:

没有内置函数可以做到这一点。如果您正在寻找可以为您执行此操作的简短 python 代码,这是我的尝试:

def longest_common_prefix(words):
    i = 0
    while len(set([word[:i] for word in words])) <= 1:
        i += 1
    return words[0][:i-1]

解释:words 是一个可迭代的字符串。列表理解

[word[:i] for word in words]

使用字符串切片来获取每个字符串的第一个 i 字母。一开始,这些都是空字符串。然后,它将由每个单词的第一个字母组成。然后是前两个字母,依此类推。

转换为 set 会删除重复项。例如,set([1, 2, 2, 3]) = 1, 2, 3。通过将我们的前缀列表转换为一个集合,我们删除了重复项。如果集合的长度小于或等于一,那么它们都是相同的。

计数器i 只记录到目前为止有多少字母相同。

我们返回words[0][i-1]。我们任意选择第一个单词并取第一个i-1 字母(对于列表中的任何单词都是相同的)。它是i-1 而不是i 的原因是i 在我们检查所有单词是否仍然共享相同的前缀之前会递增。

【讨论】:

【参考方案4】:

这是一个有趣的:

l = ['nomad', 'normal', 'nonstop', 'noob']

def common_prefix(lst):
    for s in zip(*lst):
        if len(set(s)) == 1:
            yield s[0]
        else:
            return

result = ''.join(common_prefix(l))

结果:

'no'

回答您的问题的精神 - zip(*lst) 允许您“同时迭代列表中每个字符串中的字母”。例如,list(zip(*lst)) 看起来像这样:

[('n', 'n', 'n', 'n'), ('o', 'o', 'o', 'o'), ('m', 'r', 'n', 'o'), ('a', 'm', 's', 'b')]

现在您需要做的就是找出共同的元素,即每个组的setlen,如果它们是共同的 (len(set(s)) == 1),则将其加入。


顺便说一句,您可能不想使用名称list 来称呼您的列表。之后任何时候打电话给list()都会让人头疼。隐藏内置关键字是不好的做法。

【讨论】:

以上是关于如何获取列表中字符串的公共前缀[重复]的主要内容,如果未能解决你的问题,请参考以下文章

C#:如何从 XElement 中获取名称(带前缀)作为字符串?

Redis 获取列表项并附加前缀

寻求有关如何从特定数组中获取所有过滤列表的帮助

如何忽略我认为基于属性重复的额外结果?

如何在servlet java中获取客户端公共IP地址[重复]

Haskell 中最长的公共前缀