用于检查值是不是在列表中的逻辑不适用于 set

Posted

技术标签:

【中文标题】用于检查值是不是在列表中的逻辑不适用于 set【英文标题】:Logic used for checking if value is in a list not working for set用于检查值是否在列表中的逻辑不适用于 set 【发布时间】:2020-05-10 09:27:22 【问题描述】:

我正在编写一个程序,它可以从文件中删除重复的单词,而不管大小写。单词被定义为没有空格和重复的任何字符序列,DUPLICATE、Duplicate 和 DuPliCate 都是重复的。

我已经通过将原始文本作为单词(字符串)列表读取并通过检查当前单词是否在唯一单词列表中来创建新的唯一字符串列表来使程序工作。如果它不在唯一列表中,则将其附加到列表中;忽略换行符的重复。

正如你们许多人所知,使用列表效率不高,尤其是对于大型文本文件。所以我试图通过使用一个集合来确定我是否应该将特定单词附加到唯一列表来实现这个功能。

这个逻辑有效但效率低:

def remove_duplicates(self):
    """
    :return: void
    Adds each unique word to a new list, checking for all the possible cases.
    """
    print("Removing duplicates...")
    unique = []
    for elem in self.words:
        if elem == '\n':
            unique.append(elem)
        else:
            if elem not in unique \
                    and elem.upper() not in unique \
                    and elem.title() not in unique \
                    and elem.lower() not in unique:
                unique.append(elem)
    self.words = unique

所以合乎逻辑的做法是使用这样的集合:

def remove_duplicates(self):
    """
    :return: void
    Adds each unique word to a new list, checking for all the possible cases.        
    """
    print("Removing duplicates...")
    unique = []
    seen = set()
    for elem in self.words:
        lower = elem.lower()       
        seen.add(lower)
        if elem == '\n':
            unique.append(elem)
        else:
            if lower not in seen:
                unique.append(elem)       
    self.words = unique

但是,它似乎不起作用。我最终得到一个空的文本文件。我已经打印了集合,它不是空的。嵌套 if 语句中似乎存在问题,并且对它可能是什么感到困惑。我一直在尝试调试这个几个小时,但没有运气。我什至尝试完全按照我在工作效率低的示例中所做的那样编写 if 语句,但它仍然给我同样的问题。我不明白为什么它没有将单词附加到唯一。

示例输入:

self.words = ["duplicate", "not", "DUPLICATE", "DuPliCate", "hot"]

预期输出(需保留原顺序,只保留第一个重复单词):

 unique = ["duplicate", "not", "hot"] 

【问题讨论】:

你能提供样本数据和预期输出吗?还有错误(如果有)。 【参考方案1】:

您在检查对象之前将其添加到seen,因此它始终存在于您的if 语句的seen 中。

for elem in self.words:
            lower = elem.lower()       

            if lower not in seen:
                unique.append(elem)
                seen.add(lower) # move your seen statement to exist within the check
self.words = unique

return self.words

Removing duplicates...
['duplicate', 'not', 'hot']

【讨论】:

以上是关于用于检查值是不是在列表中的逻辑不适用于 set的主要内容,如果未能解决你的问题,请参考以下文章

检查孩子是不是存在不适用于AngularFire2

发送邮件不适用于复制的数据列表

查找功能不适用于未排序的列表

滚动侦听器不适用于 SingleChildScrollView Flutter 中的列表视图

ReactJS onClick 不适用于菜单中的第一个元素

@Html.HiddenFor 不适用于 ASP.NET MVC 中的列表