【问题标题】:Efficiently removing duplicates from a list [duplicate]有效地从列表中删除重复项[重复]
【发布时间】:2020-02-18 23:05:50
【问题描述】:

晚上好。我有一个包含邮政编码和相关信息的 excel 文件。这些邮政编码有很多重复。我想通过将它们全部放在一个没有重复的列表中来弄清楚我有哪些邮政编码。这段代码可以运行,但运行速度很慢(花了 100 多秒),我想知道我能做些什么来提高它的效率。

我知道每次都必须检查整个列表是否有重复项会大大降低效率,但我不知道如何解决这个问题。我也知道遍历每一行可能不是最好的答案,但我还是很新,现在卡住了。

提前致谢。

import sys
import xlrd

loc = ("locationOfFile")
wb = xlrd.open_workbook(loc)
sheet = wb.sheet_by_index(0)

def findUniqueZips():
    zipsInSheet = []
    for i in range(sheet.nrows):
        if str(sheet.cell(i,0).value) in zipsInSheet:
            pass
        else:
            zipsInSheet.append(str(sheet.cell(i,0).value))
    print(zipsInSheet)

findUniqueZips()

【问题讨论】:

    标签: python performance xlrd zipcode


    【解决方案1】:

    如果您希望避免重复,那么您绝对应该考虑在 python 中使用 Sets。见here

    我要做的是创建一个集合,然后简单地将所有元素添加到一个集合中;请注意,集合是无序的、唯一的项目集合。一旦添加了所有数据,您就可以将集合中的所有元素添加到您的工作表中。因此,这避免了冗余数据。

    
    
    import sys
    import xlrd
    
    loc = ("locationOfFile")
    wb = xlrd.open_workbook(loc)
    sheet = wb.sheet_by_index(0)
    
    def findUniqueZips():
        zipsInSheet = []
        data = set()
    
        for i in range(sheet.nrows):
          data.add(str(sheet.cell(i,0).value)
    
        #now add all elements in the set to your sheet
        for i in range(len(data)):
          zipsInSheet.append(str(sheet.cell(i,0).value))
        print(zipsInSheet)
    
    findUniqueZips()
    

    【讨论】:

    • 另外,请注意,如果需要,您可能需要在循环范围内减去 -1
    【解决方案2】:

    我通常只是把它转换成一个集合。套装是你的朋友。它们比列表快得多。除非您有意需要或想要重复,否则请使用集合。

    https://docs.python.org/3.7/tutorial/datastructures.html?highlight=intersection#sets

    【讨论】:

    • 是的,如果您的值是可散列的,那么 set 非常适合对列表进行重复数据删除。虽然它们不保持秩序 - 有时这是一个缺点,但有一种方法可以解决仍然很快的问题。
    • 有一个有序集合模块:pypi.org/project/ordered-set 但是我同意你不能对所有东西都使用集合,但通常你可以。对于非常大的集合与非常大的列表,当您使用“in”子句检查其内容中的项目时,它们的速度可能会快一个数量级以上。 (即使是有序集合也比列表查找更快)
    猜你喜欢
    • 2015-01-17
    • 2014-09-30
    • 1970-01-01
    • 2020-04-22
    • 2018-09-30
    • 2013-09-19
    • 2011-10-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多