2017-06-22 3 views
1

Je dois accélérer le temps de compter les éléments distincts dans ce code et je ne suis pas vraiment sûr de savoir comment faire un compte plus rapide.Liste rapide distincte des éléments dans un tableau 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

@Coldspeed pourquoi ajouter à une liste à convertir pour définir par la suite? –

+0

@ Jean-FrançoisFabre Non, pas nécessaire. En fait mentionné seulement comme une solution rapide au code existant OP. Mais il existe de meilleurs moyens ... –

+0

@Coldspeed nous attendons une bonne réponse de votre part car vous savez comment les cuisiner :) –

Répondre

1

Procédé maître pour compter des éléments distincts dans un réseau de python est:

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

sortie:

6 
+0

comment OP peut-il adapter votre méthode à son code? note: ceci est un _list_ pas un tableau. –

+0

ce code est correct pour toutes les itérations liste ou tableau ....;), ici c'est une liste à droite mais si array = np.array ([1,1,2,3,3,4,5,6,6 ]) c'est correct. – glegoux

+0

@glegoux Comment OP ferait-il le changement? Quelle variable doit être convertie? Etc –

0

catégorie Initialiser comme un ensemble; et retirez le bloc si pour ajouter des données dans la catégorie, le remplacer par 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]) 

Hope this est clair

1

Sans beaucoup de connaissances sur vos données, voici un moyen rapide de maintenir un ensemble de mots uniques pour vos groupes, en utilisant 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

Je pense que 'collections.Counter' serait encore mieux:' categories [groupe [0]]. Update (données) ', pas de boucle. mais assez sympa, OP trouvera cela adapté à son cas. –

+0

Le compteur est bon, mais la boucle est probablement encore nécessaire, sans plus d'informations sur les données de l'OP. Et s'ils ne veulent rien compter dans 'row [1:]', par exemple. –

+0

btw félicitations pour votre rang de semaine. Newsflash: vous ne pouvez pas battre Gordon alors n'essayez même pas :) Une fois que j'ai fait 350 dans une journée, mais ne pouvait toujours pas le battre. –