从Python中的csv列检索第一次出现的每个唯一值的更有效方法

时间:2013-03-19 20:35:31

标签: python algorithm iteration

我获得的大型csv有一张大型飞行数据表。我编写的帮助解析它的函数遍历Flight ID的列,然后按照首次出现的顺序返回包含每个唯一Flight ID的索引和值的字典。

Dictionary = {Index:FID,...}

这是对旧功能的快速调整,不需要担心列中的FID重复(几十行后......)。

现在,我让它迭代并按顺序比较每个值。如果某个值等于它之后的值,则会跳过该值。如果下一个值不同,则将值存储在字典中。我把它改为现在也检查之前是否已经发生过该值,如果是,则跳过它 这是我的代码:

def DiscoverEarliestIndex(self, number):                                             
        finaldata = {}                                                        
        columnvalues = self.column(number)                                             
        columnenum = {}                                                         
        for a, b in enumerate(columnvalues):                                           
            columnenum[a] = b                                                   
        i = 0                                                                                                                    
        while i < (len(columnvalues) - 1):                                             
            next = columnenum[i+1]                                              
            if columnvalues[i] == next:                                                
                i += 1                                                          
            else:                                                               
                if next in finaldata.values():                                
                    i += 1                                                      
                    continue                                                    
                else:                                                           
                    finaldata[i+1]= next                                      
                    i += 1                                                      
        else:                                                                   
            return finaldata 

效率非常低,随着字典的增长而变慢。这个专栏有520万行,所以使用Python处理这个问题显然不是一个好主意,但我现在仍然坚持使用它。

有没有更有效的方法来编写这个函数?

3 个答案:

答案 0 :(得分:1)

您实际上在寻找数据库。数据库完全适用于大型数据集上的此类操作。使用CSV module一次解析整个CSV并将其发送到数据库中比将它们存储在dict中并对整个dict运行检查要快得多。

*large* python dictionary with persistence storage for quick look-ups

答案 1 :(得分:1)

要直接回答您的问题,您应该可以使用dict comprehensions和itertools模块执行此操作。

>>> import itertools as it
>>> data = {1: 'a', 2: 'a', 3: 'c', 4: 'c', 5:'d' }
>>> grouped_shit = {k: list(v) for (k,v) in it.groupby(data.iteritems(), lambda (_,v): v)}
>>> good_shit = {v[0][0]: k for (k, v) in grouped_shit.iteritems()}
>>> good_shit
{1: 'a', 3: 'c', 5: 'd'}

我认为这可以稍微调整一下 - 我不会非常高兴两次翻阅dict。但无论如何,我认为dict理解非常有效。此外,groupby假设您的密钥是有序的 - 也就是说,它假设所有'a'索引都组合在一起,这在您的情况下似乎是正确的。

答案 2 :(得分:1)

if next in thegoodshit.values():   

可能是你的问题,你在这里做的是

  1. 创建列表
  2. 搜索列表
  3. 也许您可以使用set来保存值并搜索 - 就像这样:

        while i < (len(columnvalues) - 1):                                             
            next = columnenum[i+1]                                              
            if columnvalues[i] == next:                                                
                i += 1                                                          
            else:                                                               
                if next in searchable_data:                                
                    i += 1                                                      
                    continue                                                    
                else:                                                           
                    finaldata[i+1]= next
                    searchable_data.add(next)                 
                    i += 1                                                      
        else:                                                                   
            return finaldata