2017-06-23 2 views
0

J'ai une liste de « ids »:Retour l'index d'une liste d'un match de fuzzywuzzy

ids = [None, '20160928a', '20160929a', ... ] 

et une autre liste de certains « ids » que je trouve sont en double ids utilisant fuzzywuzzy:

repeat_offenders = ['20160928a', '20161115a', '20161121a', ... ] 

Je voudrais à nouveau utiliser fuzzywuzzy pour créer une liste de listes contenant des listes d'où (par index) les identifiants dupliqués se trouvent dans la liste 'ids'. Ainsi, la sortie ressemblerait à quelque chose comme ça (et parce qu'ils sont des doublons chaque liste dans la liste contiendrait au moins deux éléments:

collected_ids = [[0,5,700], [6,3], [4,826,12]] 

Ma tentative, qui retourne actuellement que les ids pas l'emplacement de l'ID:

collected_urls = [] 
for offender in repeat_offenders[:10]: 
    best_match = process.extract(offender, ids) 
    collection = [] 
    for match in best_match: 
     if match[1] > 95: 
      collection.append(match[0]) 
     else: 
      pass 
    collected_urls.append(collection) 

mise à jour, ma tentative d'utiliser la réponse de Moe pour trouver/groupe correspond exactement:

idz = ids 
collected_ids = [] 
for i in range(len(idz)): 
    tmp = [i] 
    for j in range(len(ids)): 
     if idz[i] == idz[j] and i != j: 
      tmp.append(j) 
      del j 
    if len(tmp) > 1: 
     collected_ids.append(tmp) 
    del i 
+0

des raisons pour lesquelles vous utilisez 'fuzzywuzzy' pour trouver des doublons, si les chaînes correspondent ne pouvez-vous pas simplement tester l'égalité? –

+0

parce que je veux regrouper des identifiants similaires car les 'doublons' peuvent ne pas être exactement (100%) les mêmes, c'est pourquoi j'ai utilisé le seuil de 95 ... mais quelques-uns des doublons sont exactement les mêmes - de sorte que l'utilisation d'un l'égalité peut être l'option la plus facile (et une assez bonne)..Est-ce que cela vous dérangerait de me montrer comment faire ce que je demande sur la base d'une égalité? Merci! –

Répondre

1

Si vous utilisez fuzzywuzzy n'est pas un must, vous pouvez utiliser deux for-loops pour vérifier les doublons et générer le list comme suit:

collected_ids = [] 
for i in xrange(len(ids)): 
    tmp = [i] 
    for j in xrange(len(ids)): 
     if ids[i] == ids[j] and i != j: 
      tmp.append(j) 
    if len(tmp) > 1: 
     collected_ids.append(tmp) 
collected_ids = list(set(collected_ids)) 

EDIT:

Si vous voulez éviter les doublons, vous pouvez créer une liste pour vérifier si l'index est déjà ajouté ou non comme ce qui suit:

collected_ids = [] 
ids = ['a', 'b', 'a', 'c', 'd', 'a', 't', 't', 'k', 'c'] 
check = [] 
for i in range(len(ids)): 
    tmp = [i] 
    check.append(i) 
    for j in range(len(ids)): 
     if ids[i] == ids[j] and i != j and j not in check: 
      tmp.append(j) 
      check.append(j) 
    if len(tmp) > 1: 
     collected_ids.append(tmp) 
print(collected_ids) 

sortie:

[[0, 2, 5], [3, 9], [6, 7]] 
+0

Merci, mais cela ne fonctionne pas ... xrange() n'est pas défini dans python3 (qui est ce que j'utilise). Une autre chose est qu'une fois que 'i' l'a trouvée, elle correspond et ses correspondances devraient être supprimées de la liste 'ids' car sinon cela va créer un processus itératif et contenir une liste dupliquée dans collected_ids ... J'ai essayé de résoudre ces problèmes et avez 'mis à jour' ma question avec ma tentative :) –

+0

@GrahamStreich J'ai mis à jour la réponse pour éviter les doublons, s'il vous plaît vérifier et laissez-moi savoir =) –

+0

Excellent, cela a fonctionné !! –