Encontrar la cadena común en un subgrupo en una lista en Python

votos
4

Estoy tratando de limpiar una lista, mediante la eliminación de duplicados. Por ejemplo:

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

Lo ideal es que necesito para obtener la lista siguiente:

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

Lo que he intentado:

  1. Dividir la lista y eliminar duplicados (un enfoque ingenuo)

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

lo que deja una gran cantidad de 'basura':

['(Aspirin',
 '(Migraine)',
 'Abilify',
 'Abstem',
 'Abstral',
 'Cap',
 'Combined)',
 'Gppe',
 'Maintena',
 'Tab']
  1. Encontrar la palabra más frecuente:

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

Pero no estoy seguro de cómo encontrar palabras similares (un grupo) ??

Me pregunto, si se puede utilizar un tipo de 'GroupBy ()' y el primer grupo de nombres y luego eliminar los duplicados dentro de esos nombres.

Publicado el 18/12/2018 a las 11:15
fuente por usuario
En otros idiomas...                            


3 respuestas

votos
6

Se podría hacer, si quiere enviar el primer única palabra de cada cadena:

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)

Salida

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

Si desea una lista de elementos únicos en el orden de aparición, se puede hacer:

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)

Salida

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

Como alternativa a la primera solución que podría hacer:

  1. Sugerido por @ Jean-FrançoisFabre {x.split()[0] for x in bb}
  2. Sugerida por @RoadRunner set(x.split()[0] for x in bb)
Respondida el 18/12/2018 a las 11:18
fuente por usuario

votos
5

Si el orden no importa, se puede utilizar un conjunto de comprensión:

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

Si el orden es importante y que tienen Python 3.6 o superior, se puede utilizar una comprensión dict:

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

Si el orden es importante y que tienen Python 3.5 o inferior, se puede usar un OrderedDict:

from collections import OrderedDict
res = list(OrderedDict((x.split()[0],None) for x in bb))
Respondida el 18/12/2018 a las 11:36
fuente por usuario

votos
1

Usted podría tratar de dividir cada artículo y recoger sólo la primera cadena antes separador (espacio)

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

Esto se ve de conseguir lo que necesita:

['Abilify', 'Abstem', 'Gppe', 'Abstral']
Respondida el 18/12/2018 a las 11:42
fuente por usuario

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