【问题标题】:Removing words which are part of another word删除属于另一个单词的单词
【发布时间】:2021-08-03 12:05:42
【问题描述】:

假设我在 python 中有一个字符串列表,例如 -

lst = ['makeup brush tool', 'mak', 'flawless', 'tool', 'makeu', 'bru', 'brus', 'brush', 'makeup brush', 'cosmetic brush holder', 'elf makeup', 'key holder', 'holder', 'flaw', 'flawl', 'marinade brush', 'cosmetic', 'makeup brush cleaner', 'makeup brush holder', 'brush holder']

现在像“mak”这样的单个词是另一个词“makeu”的一部分。如何删除像“mak”这样的词。 更多示例 - 来自“bru”、“brus”和“brush” -> 必须删除“bru”和“brus”。

在此之后我无法继续 -

def remove_repeated_parts(un_corrected):
    """ Returns a corrected list """
    corrected = []
    for word in un_corrected:
        string_split = word.split()
        if len(string_split) == 1:
             # what to do from here


remove_repated_parts(lst)

预期输出 -

lst = ['makeup brush tool', 'flawless', 'tool', 'makeu', 'brush', 'makeup brush', 'cosmetic brush holder', 'elf makeup', 'key holder', 'holder', 'marinade brush', 'cosmetic', 'makeup brush cleaner', 'makeup brush holder', 'brush holder']

注意我们只考虑长度为 1 的字符串

跟RegEx有关系吗?

【问题讨论】:

  • 你能显示你的输出列表将包含什么吗?

标签: python regex list


【解决方案1】:

您可以按如下方式使用列表推导:

new_lst = [x for x in lst if not any(x in y for y in lst if (y != x and len(y.split())==1))]
print(new_lst)

输出:

['makeup brush tool', 'flawless', 'tool', 'makeu', 'brush', 'makeup brush', 'cosmetic brush holder', 'elf makeup', 'key holder', 'holder', 'marinade brush', 'cosmetic', 'makeup brush cleaner', 'makeup brush holder', 'brush holder']

【讨论】:

  • 感谢您的帮助。但是有什么办法可以避免嵌套循环。
  • @Prakket 我认为没有,这些不是嵌套循环,它们是两个独立的循环。但是只要有一个真值,any 中的循环就会停止。所以这可能是这里所有答案中最快的方法。
  • 其实现在预期的输出有点不一样了,你能过吗?
  • 是的,它可以根据需要工作。非常感谢!
  • 还有一个疑问,我一直在努力,但没有得到预期的结果。你能帮忙吗-stackoverflow.com/questions/68664461/…
【解决方案2】:

你可以试试这个: (不使用正则表达式)

lst = ['makeup brush tool', 'mak', 'flawless', 'tool', 'makeu', 'bru', 'brus', 'brush', 'makeup brush', 'cosmetic brush holder', 'elf makeup', 'key holder', 'holder', 'flaw', 'flawl', 'marinade brush', 'cosmetic', 'makeup brush cleaner', 'makeup brush holder', 'brush holder']
def check_list(lists,l=[]):
    for m in lists:
        for n in lists:
            if m in n:
                l.append(n)
                break
    return l
print(check_list(lst))

【讨论】:

    【解决方案3】:

    没有正则表达式的解决方案:

    lst = ['makeup brush tool', 'mak', 'flawless', 'tool', 'makeu', 'bru', 'brus', 'brush', 'makeup brush', 'cosmetic brush holder', 'elf makeup', 'key holder', 'holder', 'flaw', 'flawl', 'marinade brush', 'cosmetic', 'makeup brush cleaner', 'makeup brush holder', 'brush holder']
    
    testword in sorted(lst):
        for word in lst:
            if testword !=word and testword in word:
                try:
                    lst.remove(testword)
                except ValueError:
                    pass
    print(lst)
    

    逻辑:

    1. 先对列表进行排序,短字符串更有可能被删除
    2. 每个单词都循环播放
    3. 如果我们测试的单词(“testword”)是任何其他字符串的一部分而不是其本身,则将其从列表中删除

    【讨论】:

    • 谢谢你的逻辑。输出符合预期。但是有没有办法不使用嵌套的 for 循环,因为它们在时间上非常昂贵
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-07-26
    • 2014-04-20
    • 2017-06-01
    • 2017-12-03
    • 2017-02-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多