2017-10-21 8 views
2

Ich habe eine Liste von Zeichenfolgen. Beispiel string,Vorverarbeitung Liste der Strings effizient

mesh = "Adrenergic beta-Antagonists/*therapeutic use, Adult, Aged, Aged/*effects, Antihypertensive Agents/*therapeutic use, Blood Glucose/*drug effects, Celiprolol/*therapeutic use, Female, Glucose Tolerance Test, Humans, Hypertension/*drug therapy, Male, Middle Aged, Prospective Studies" 

Für jeden Begriff in der Zeichenfolge (wo) Begriffe durch ein Komma getrennt werden, würde Ich mag alle Text nach dem ‚/‘ löschen. Wenn kein Backslash vorhanden ist, tun Sie nichts.

Zum Beispiel möchte ich die resultierende Zeichenfolge wie so sein,

mesh = "Adrenergic beta-Antagonists, Adult, Aged, Aged, Antihypertensive Agents, Blood Glucose, Celiprolol, Female, Glucose Tolerance Test, Humans, Hypertension, Male, Middle Aged, Prospective Studies" 

Ich würde dann in der Folge alle doppelten Werte löschen möchten (z. Gealtert). Gewünschte Zeichenfolge,

mesh = "Adrenergic beta-Antagonists, Adult, Aged, Antihypertensive Agents, Blood Glucose, Celiprolol, Female, Glucose Tolerance Test, Humans, Hypertension, Male, Middle Aged, Prospective Studies" 

Ich habe diesen Code geschrieben, das für eine Zeichenfolge funktioniert, aber bin auf der Suche nach einer effizienteren Art und Weise dies für eine Liste von Strings zu tun:

import string 
mesh = "Adrenergic beta-Antagonists/*therapeutic use, Adult, Aged, Aged/*effects, Antihypertensive Agents/*therapeutic use, Blood Glucose/*drug effects, Celiprolol/*therapeutic use, Female, Glucose Tolerance Test, Humans, Hypertension/*drug therapy, Male, Middle Aged, Prospective Studies" 
newMesh = [] 
for each in mesh.split(","): 
    newMesh.append(each.split('/', 1)[0].lstrip(' ')) 
newMesh = list(set(newMesh)) 
meshString = ",".join(newMesh) 
print(meshString) 

Hinweis: Die Reihenfolge der Die Begriffe in der Zeichenfolge sind irrelevant.

+0

Bitte beenden Sie das Hinzufügen von falschen Tags, was Sie haben, ist _not_ ein Datenframe. –

+0

@ cᴏʟᴅsᴘᴇᴇᴅ Entschuldigung - nicht sicher, was ich dachte ... – jdoe

+1

Wrap in Funktion und wenden Sie es auf Karte. 'list_of_strings = list (map (your_function, list_of_strings))' –

Antwort

4

können Sie re.sub verwenden:

mesh = "Adrenergic beta-Antagonists/*therapeutic use, Adult, Aged, Aged/*effects, Antihypertensive Agents/*therapeutic use, Blood Glucose/*drug effects, Celiprolol/*therapeutic use, Female, Glucose Tolerance Test, Humans, Hypertension/*drug therapy, Male, Middle Aged, Prospective Studies" 
import re 
s = re.sub("\/\*[\w\s]+", '', mesh) 
final_string = [] 
for i in re.split(",", s): 
    if i not in final_string: 
     final_string.append(i) 

new_final_string = ', '.join(final_string) 
print(new_final_string) 

Ausgang:

'Adrenergic beta-Antagonists, Adult, Aged, Antihypertensive Agents, Blood Glucose, Celiprolol, Female, Glucose Tolerance Test, Humans, Hypertension, Male, Middle Aged, Prospective Studies' 
+0

Was ist der effizienteste Weg, um die doppelten Tokens aus dieser Zeichenfolge zu entfernen? – jdoe

+0

@jdoe bitte meine letzte Änderung. – Ajax1234

+0

Habe bearbeitet, um Fehler zu korrigieren - (z. B. Adrenergic Beta-Antagonisten ist ein einzelnes Token) – jdoe

0

Mit re.sub() Funktion und set Objekt (für eine schnellere Objektsuche):

import re 

mesh = "Adrenergic beta-Antagonists/*therapeutic use, Adult, Aged, Aged/*effects, Antihypertensive Agents/*therapeutic use, Blood Glucose/*drug effects, Celiprolol/*therapeutic use, Female, Glucose Tolerance Test, Humans, Hypertension/*drug therapy, Male, Middle Aged, Prospective Studies" 
word_set = set() 
result = [] 

for w in re.sub(r'/[^,]+', '', mesh).split(','): 
    w = w.strip() 
    if w not in word_set: 
     result.append(w) 
     word_set.add(w) 
result = ', '.join(result) 

print(result) 

Der Ausgang:

Adrenergic beta-Antagonists, Adult, Aged, Antihypertensive Agents, Blood Glucose, Celiprolol, Female, Glucose Tolerance Test, Humans, Hypertension, Male, Middle Aged, Prospective Studies 
Verwandte Themen