Encontrar a corda comum em um subgrupo de uma lista em Python

votos
4

Eu estou tentando limpar uma lista, removendo duplicatas. Por exemplo:

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

Idealmente, eu preciso para obter a lista a seguir:

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

O que eu tentei:

  1. Dividir a lista e remover duplicatas (uma abordagem ingênua)

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

o que deixa um monte de 'lixo':

['(Aspirin',
 '(Migraine)',
 'Abilify',
 'Abstem',
 'Abstral',
 'Cap',
 'Combined)',
 'Gppe',
 'Maintena',
 'Tab']
  1. Encontrar a palavra mais frequente:

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

Mas eu não tenho certeza de como encontrar palavras semelhantes (um grupo) ??

Eu estou querendo saber, se é possível usar uma espécie de 'groupby ()' e primeiro grupo de nomes e, em seguida, remover duplicatas dentro desses nomes.

Publicado 18/12/2018 em 11:15
fonte usuário
Em outras línguas...                            


3 respostas

votos
6

Você poderia fazer, supondo que você quer a primeira única palavra de cada string:

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)

Saída

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

Se você quer uma lista de elementos únicos na ordem de aparição, você pode fazer:

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)

Saída

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

Como uma alternativa para a primeira solução que você poderia fazer:

  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)
Respondeu 18/12/2018 em 11:18
fonte usuário

votos
5

Se a ordem não importa, você pode usar uma compreensão definida:

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

Se as questões de ordem e você tem Python 3.6 ou superior, você pode usar uma compreensão dict:

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

Se as questões de ordem e você tem Python 3.5 ou inferior, você pode usar um OrderedDict:

from collections import OrderedDict
res = list(OrderedDict((x.split()[0],None) for x in bb))
Respondeu 18/12/2018 em 11:36
fonte usuário

votos
1

Você poderia tentar dividir cada item e recolher apenas a primeira cadeia antes separador (espaço)

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

Isso parece de conseguir o que você precisa:

['Abilify', 'Abstem', 'Gppe', 'Abstral']
Respondeu 18/12/2018 em 11:42
fonte usuário

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