Finden Sie die gemeinsame Zeichenfolge in einer Untergruppe in einer Liste in Python

stimmen
4

Ich versuche, eine Liste zu reinigen, durch Duplikate zu entfernen. Zum Beispiel:

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

Idealerweise muss ich die folgende Liste erhalten:

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

Was ich versucht:

  1. Teilen Sie die Liste und Duplikate entfernen (ein naiver Ansatz)

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

das läßt viel ‚Müll‘:

['(Aspirin',
 '(Migraine)',
 'Abilify',
 'Abstem',
 'Abstral',
 'Cap',
 'Combined)',
 'Gppe',
 'Maintena',
 'Tab']
  1. Finden Sie das häufigste Wort:

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

Aber ich bin nicht sicher, wie ähnliche Worte zu finden (eine Gruppe) ??

Ich frage mich, ob man eine Art ‚groupby ()‘ und die erste Gruppe von Namen verwenden können, und dann innerhalb dieser Namen Duplikate entfernen.

Veröffentlicht am 18/12/2018 um 11:15
quelle vom benutzer
In anderen Sprachen...                            


3 antworten

stimmen
6

Sie tun können, vorausgesetzt , Sie die einzigartige erste wollen Wort jeder Saite:

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)

Ausgabe

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

Wenn Sie eine Liste der einzigartigen Elemente in der Reihenfolge des Erscheinens möchten, können Sie tun:

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)

Ausgabe

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

Als Alternative zu der ersten Lösung, die Sie tun können:

  1. Vorgeschlagen von @ Jean-FrançoisFabre {x.split()[0] for x in bb}
  2. Vorgeschlagen von @RoadRunner set(x.split()[0] for x in bb)
Beantwortet am 18/12/2018 um 11:18
quelle vom benutzer

stimmen
5

Wenn Auftrag spielt keine Rolle, können Sie ein Set Verständnis verwenden:

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

Wenn Auftragsangelegenheiten und Sie haben Python 3.6 oder höher, können Sie ein dict Verständnis verwenden:

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

Wenn Auftrag Fragen und Sie haben Python 3.5 oder niedriger, können Sie eine OrderedDict verwenden:

from collections import OrderedDict
res = list(OrderedDict((x.split()[0],None) for x in bb))
Beantwortet am 18/12/2018 um 11:36
quelle vom benutzer

stimmen
1

Sie könnten versuchen, jedes Element geteilt und nur die erste Zeichenfolge vor Separator (Raum) sammeln

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

Das sieht bekommen, was Sie brauchen:

['Abilify', 'Abstem', 'Gppe', 'Abstral']
Beantwortet am 18/12/2018 um 11:42
quelle vom benutzer

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