Znajdź wspólny ciąg w podgrupie na liście w Pythonie

głosy
4

Próbuję oczyścić listę, poprzez usuwanie duplikatów. Na przykład:

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

Idealnie, trzeba uzyskać następującą listę:

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

Co próbowałem:

  1. Podzielić listę i usuwanie duplikatów (naiwne podejście)

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

który pozostawia wiele „śmieci”:

['(Aspirin',
 '(Migraine)',
 'Abilify',
 'Abstem',
 'Abstral',
 'Cap',
 'Combined)',
 'Gppe',
 'Maintena',
 'Tab']
  1. Znajdź najczęstszą słowo:

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

Ale nie jestem pewien, jak znaleźć podobne słowa (grupa) ??

Zastanawiam się, czy można korzystać z pewnego rodzaju „GroupBy ()” i pierwszej grupy nazw i następnie usunąć duplikaty w tych nazwach.

Utwórz 18/12/2018 o 11:15
źródło użytkownik
W innych językach...                            


3 odpowiedzi

głosy
6

Można to zrobić, zakładając chcesz unikalną pierwsze słowo każdego napisu:

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)

Wydajność

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

Jeśli chcesz listę unikatowych elementów w kolejności występowania, można zrobić:

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)

Wydajność

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

Jako alternatywę do pierwszego rozwiązania można zrobić:

  1. Sugerowane przez @ Jean-FrançoisFabre {x.split()[0] for x in bb}
  2. Sugerowana przez @RoadRunner set(x.split()[0] for x in bb)
Odpowiedział 18/12/2018 o 11:18
źródło użytkownik

głosy
5

Jeśli kolejność nie ma znaczenia, można użyć zestawu ze zrozumieniem:

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

Jeśli sprawy zamówienie i masz Python 3.6 lub nowszy, można użyć zrozumieniem dict:

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

Jeśli sprawy zamówienie i masz Python 3.5 lub niższy, można użyć OrderedDict:

from collections import OrderedDict
res = list(OrderedDict((x.split()[0],None) for x in bb))
Odpowiedział 18/12/2018 o 11:36
źródło użytkownik

głosy
1

Można spróbować podzielić każdą pozycję i zbierać tylko pierwszy ciąg przed separatora (spacja)

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

Wygląda to na uzyskanie co trzeba:

['Abilify', 'Abstem', 'Gppe', 'Abstral']
Odpowiedział 18/12/2018 o 11:42
źródło użytkownik

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