Найти общую строку в подгруппе в списке в Python - PullRequest
0 голосов
/ 18 декабря 2018

Я пытаюсь очистить список, удалив дубликаты.Например:

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

В идеале мне нужно получить следующий список:

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

Что я пробовал:

  1. Разделить списоки удалите дубликаты (наивный подход)

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

, что оставляет много «мусора»:

['(Aspirin',
 '(Migraine)',
 'Abilify',
 'Abstem',
 'Abstral',
 'Cap',
 'Combined)',
 'Gppe',
 'Maintena',
 'Tab']
Найдите самое частое слово:

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

Но я не уверен, как найти похожие слова (группа) ??

Мне интересно, можно ли использовать своего рода groupby () и первую группу по именам, а затем удалять дубликаты в этих именах.

Ответы [ 3 ]

0 голосов
/ 18 декабря 2018

Если порядок не имеет значения, вы можете использовать понимание набора:

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

Если порядок имеет значение, и у вас есть Python 3.6 или выше, вы можете использовать понимание dict:

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

Если порядок имеет значение, и у вас есть Python 3.5 или ниже, вы можете использовать OrderedDict:

from collections import OrderedDict
res = list(OrderedDict((x.split()[0],None) for x in bb))
0 голосов
/ 18 декабря 2018

Вы можете попробовать разделить каждый элемент и собрать только первую строку перед разделителем (пробел)

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

Это выглядит так, чтобы получить то, что вам нужно:

['Abilify', 'Abstem', 'Gppe', 'Abstral']
0 голосов
/ 18 декабря 2018

Вы можете сделать это, предполагая, что вы хотите уникальное первое слово каждой строки:

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)

Выход

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

Есливам нужен список уникальных элементов в порядке появления, вы можете сделать:

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)

Вывод

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

В качестве альтернативы первому решению выможет сделать:

  1. Предложено @ Жан-Франсуа Фабр {x.split()[0] for x in bb}
  2. Предложено @RoadRunner set(x.split()[0] for x in bb)
...