2017-06-22 51 views
1

我需要加快計算此代碼中不同元素的時間,並且我不確定如何執行更快的計數。數組中元素的快速截然不同的列表python

def process_columns(columns): 
    with open(columns, 'r') as src: 
     data = csv.reader(src, delimiter ='\t', skipinitialspace = False) 
     category = [] 
     group = columns.split("/") 
     group = group[-1].split(".") 
     if group[0] in ["data_1", "data_2"]: 
      for row in data: 
       if row[0] not in category: 
        category.append(row[0]) 
      message = "\t%d distinct elements from %ss" % (len(category), group[0]) 
     print message 
+0

@折速爲什麼附加到列表後轉換爲設置? –

+0

@ Jean-FrançoisFabre不需要,不需要。實際上提到它只是作爲OP現有代碼的快速修復。但有更好的方法... –

+0

@速速我們正在等待你的一個很好的答案,因爲你知道如何做飯:) –

回答

1

的主方法,以計數在一個python陣列不同元件是:

array = [1,1,2,3,3,4,5,6,6] 
n_elts = len(set(array)) 
print(n_elts) 

輸出:

6 
+0

OP如何使你的方法適應他/她的代碼?注意:這是一個_list_不是數組。 –

+0

這段代碼對於所有可迭代列表或數組是正確的...;),這裏它是一個列表,但是如果array = np.array([1,1,2,3,3,4,5,6,6 ]) 它是正確的。 – glegoux

+0

@glegoux OP如何做出改變?什麼變量將被轉換?等等 –

0

初始化類爲一組;並刪除if塊將數據添加到類別中,與category.add更換

category = {} 
group = columns.split("/") 
group = group[-1].split(".") 
if group[0] in ["data_1", "data_2"]: 
    for row in data: 
     category.add(row[0]) 

希望這是明確的

1

不會對你的數據多少知識,這裏是保持一組唯一字的快捷方式爲您的團體,使用collections.defaultdict

from collections import defaultdict 

def process_columns(columns): 
    categories = defaultdict(set) # initialises a default dict with values as sets 
    with open(columns, 'r') as src: 
     data = csv.reader(src, delimiter ='\t', skipinitialspace = False) 
     group = columns.split("/")[-1].split('.') 

     for row in data: 
      categories[group[0]].update(row[0])  

     for k in categories: 
      message = "\t%d distinct elements from %ss" % (len(categories[k]), k) 
      print message 
+0

我認爲'collections.Counter'會更好:'categories [group [0]]。update(data)',沒有循環。但不錯,OP會發現適合他/她的情況。 –

+0

計數器很好,但是循環可能仍然是必需的,沒有關於OP數據的更多信息。例如,如果他們不想在'row [1:]'中計算任何內容。 –

+0

btw祝賀你的星期排名。新聞快訊:你不能擊敗戈登,所以甚至不要嘗試:)一旦我在一天內完成了350次,但仍然無法戰勝他。 –

相關問題