有效地预处理字符串列表

2024-05-23 21:11:08 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个字符串列表。示例字符串

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"

对于字符串中的每个术语(其中术语用逗号分隔),我想删除“/”后面的所有文本。如果没有反斜杠,什么也不做。你知道吗

例如,我希望得到的字符串是这样的

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

然后我想删除字符串中的任何重复值(例如,Aged)。所需字符串

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

我已经编写了这段适用于一个字符串的代码,但是我正在寻找一种更有效的方法来处理字符串列表:

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)

注意:字符串中术语的顺序无关紧要。你知道吗


Tags: 字符串usebetaagentsmesheffectsbloodadult
2条回答

您可以使用re.sub

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)

输出:

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

使用re.sub()函数和set对象(用于更快的项目搜索):

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)

输出:

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

相关问题 更多 >