Trouver la chaîne commune dans un sous-groupe dans une liste en Python

voix
4

Je suis en train de nettoyer une liste, en supprimant les doublons. Par exemple:

 bb = ['Gppe (Aspirin Combined)', 
       'Gppe Cap (Migraine)',  
       'Gppe Tab', 
       'Abilify', 
       'Abilify Maintena', 
       'Abstem', 
       'Abstral']

, Je dois idéalement pour obtenir la liste suivante:

 bb = ['Gppe', 
       'Abilify', 
       'Abstem', 
       'Abstral']

Ce que j'ai essayé:

  1. Diviser la liste et supprimer les doublons (une approche naïve)

    list(set(sorted([j for bb_i in bb for j in bb_i.split(' ')])))

ce qui laisse beaucoup de « déchets »:

['(Aspirin',
 '(Migraine)',
 'Abilify',
 'Abstem',
 'Abstral',
 'Cap',
 'Combined)',
 'Gppe',
 'Maintena',
 'Tab']
  1. Trouver le mot le plus fréquent:

Counter(['Gppe (Aspirin Combined)', 'Gppe Cap (Migraine)', 'Gppe Tab').most_common(1)[0][0]

Mais je ne suis pas sûr de savoir comment trouver des mots similaires (un groupe) ??

Je me demande, si on peut utiliser une sorte de « groupby () » et premier groupe par noms puis supprimer les doublons dans ces noms.

Créé 18/12/2018 à 11:15
source utilisateur
Dans d'autres langues...                            


3 réponses

voix
6

Vous pouvez le faire, en supposant que vous voulez le premier unique , mot de chaque chaîne:

bb = ['Gppe (Aspirin Combined)',
       'Gppe Cap (Migraine)',
       'Gppe Tab',
       'Abilify',
       'Abilify Maintena',
       'Abstem',
       'Abstral']


result = set(map(lambda x: x.split()[0], bb))
print(result)

Sortie

{'Gppe', 'Abstral', 'Abilify', 'Abstem'}

Si vous voulez une liste d'éléments uniques dans l'ordre d'apparition, vous pouvez le faire:

bb = ['Gppe (Aspirin Combined)',
       'Gppe Cap (Migraine)',
       'Gppe Tab',
       'Abilify',
       'Abilify Maintena',
       'Abstem',
       'Abstral']

seen = set()
result = []
for e in bb:
    key = e.split()[0]
    if key not in seen:
        result.append(key)
        seen.add(key)

print(result)

Sortie

['Gppe', 'Abilify', 'Abstem', 'Abstral']

Comme alternative à la première solution que vous pourriez faire:

  1. Proposé par @ Jean-FrançoisFabre {x.split()[0] for x in bb}
  2. Proposé par @RoadRunner set(x.split()[0] for x in bb)
Créé 18/12/2018 à 11:18
source utilisateur

voix
5

Si l'ordre n'a pas d'importance, vous pouvez utiliser une compréhension set:

res = list({x.split()[0] for x in bb})

Si les questions d'ordre et vous avez Python 3.6 ou plus, vous pouvez utiliser une compréhension dict:

res = list({x.split()[0]:None for x in bb})

Si les questions d'ordre et vous avez Python 3.5 ou plus bas, vous pouvez utiliser un OrderedDict:

from collections import OrderedDict
res = list(OrderedDict((x.split()[0],None) for x in bb))
Créé 18/12/2018 à 11:36
source utilisateur

voix
1

Vous pouvez essayer de diviser tous les éléments et ne recueillir que la première chaîne avant séparateur (espace)

print(list(set(item.split(' ',1)[0] for item in bb)))

Cela semble d'obtenir ce dont vous avez besoin:

['Abilify', 'Abstem', 'Gppe', 'Abstral']
Créé 18/12/2018 à 11:42
source utilisateur

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more