将最长的单词片段保留在 Python 列表中并丢弃其他单词

我有一个字符串列表,有些是较长单词的片段。我只想保留每个单词片段的最长版本。

在下面的列表中,我想保留最长的单词 'indoor outdoor beanbag lounger' 并删除其他单词片段。

示例:

list1 = ["indoor outdoor","indoor outdoor beanbag","indoor outdoor beanbag lounger"]

到目前为止我尝试过的想法和事情。

我尝试复制迭代它的列表并删除其自身的第一个精确副本。下一步是检查是否找到了一个词。例如在 indoor outdoor 中找到 indoor outdoor beanbag 如果 True,则从列表中删除。

类似的东西?我试过查看在一定程度上有效的 Polyfuzz,但我似乎无法对其进行微调,必须有一种方法可以通过循环遍历列表来解决它。

到目前为止,我的代码迭代并从列表 2 中删除第一个完全匹配

list1 = ["indoor outdoor","indoor outdoor beanbag lounger"]
list2 = ["indoor outdoor","indoor outdoor beanbag lounger"]
    
for i in list1:
    cleaned_list = [x for x in list1 if x != i]

    print(cleaned_list)
wei981106811 回答:将最长的单词片段保留在 Python 列表中并丢弃其他单词

最简单的方法是通过检查任何字符串是否是任何其他字符串的正确子字符串来获取一组正确的子字符串:

substrings = {w1 for w1 in list1 for w2 in list1 if w1 in w2 and w1 != w2}

然后从原始列表中减去这个集合。剩下的是最长的字符串:

set(list1) - substrings
#{'indoor outdoor beanbag lounger',"hello is it me you're looking for"}

通过观察较长的字符串不能是较短字符串的子字符串,您可以做得更好。按照字符串长度的顺序对列表进行排序:

list2 = sorted(list1,key=len)

组织一个搜索子串的嵌套循环:

substrings = set()
for i in range(len(list2)):
    for j in range(i + 1,len(list2)):
        if list2[i] in list2[j]: 
            substrings.add(list2[i])
            break # There may be more matches,but we don't care

您将开始看到包含 15 个以上字符串的列表的性能改进。

,

正如@atru 所建议的那样,如果您只需要最长的条目并且所有条目都用空格分隔单词,那么这个简单的代码将解决您的问题:

sorted(list1,key = lambda x: len(x))[0]

以上代码按长度对您的列表进行排序并检索最短的条目。

本文链接:https://www.f2er.com/1142.html

大家都在问