2013-03-19 51 views
0

我給出的一個大csv有一個大型的飛行數據表。我編寫的一個函數用於幫助解析它迭代Flight ID的列,然後返回一個包含每個唯一航班ID的索引和值的字典,以首次出現的順序排列。更有效地從Python中的csv列檢索每個唯一值的第一次出現

字典= {指數: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處理這個問題顯然不是一個好主意,但我暫時堅持使用它。

有沒有寫這個功能的更有效的方法?

+0

除此之外:我不確定您的術語決定(包括此處和上一個問題)對您的專業服務有多好,但顯然您的里程可能會有所不同。它讓我決定不花時間指出某些問題,無論如何:生活太短暫。 (提示:'.values()'返回的是什麼?爲什麼會員測試是一個壞主意?) – DSM 2013-03-19 21:07:10

+1

沒有意識到我的牧師是在Stackoverflow上,下次我會記住這一點。 – 2013-03-19 21:32:32

回答

1
if next in thegoodshit.values(): 

可能是你的問題,你在這裏做的是

  1. 創建列表
  2. 搜索列表

也許你可以使用一個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 
+0

我明白你的意思了,但我正在搜索的價值,而不是關鍵。 – 2013-03-19 21:18:10

+0

哎呀好點 - 如何將值作爲'set'保存並進行測試? – Brad 2013-03-19 21:20:07

+0

會試試看,還有一個數據庫。無論我第一次找到時間。感謝您指出這一點,很容易因煎炸大腦而錯過微不足道的東西。 – 2013-03-19 21:28:36

1

直接回答你的問題,你應該能夠字典內涵和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'} 

我認爲這可以稍微調整一下 - 我不會超過兩次聽完字典超級高興。但無論如何,我認爲字典的理解是非常有效的。另外,groupby假設你的鑰匙是有序的 - 也就是說,它假設所有'a的指數組合在一起,這在你的情況下似乎是真實的。

+0

在前面的問題中,有一個數據看起來像這樣的小例子:[link](http:// stackoverflow。com/questions/15148983 /尋找更高效的方法來重組一個巨大的csv-in-python) 請注意,在這種情況下,所有空間都有數據。 – 2013-03-19 21:40:00

相關問題