Я не профессиональный программист, но моя текущая работа в больнице позволяет мне кодировать некоторые обходные пути для нашей ужасной системы EHR. Ниже приводится часть моего проекта Python по визуализации лабораторных данных.
Следующий фрагмент кода работает, но я не нашел способа с пониманием списка или np.where
чтобы оптимизировать его и потенциально улучшить производительность. Я еще не нашел сообщений, чтобы ответить на этот вопрос, в том числе среди тех, что были предложены при отправке вопроса.
Этот код проверяет кортеж[0] в списке кортежей (test_and_value
), состоящий из (названий лабораторных тестов, значений тестов), поиска названий лабораторных тестов с ошибками и замены их стандартными названиями лабораторных тестов.
Распространенные орфографические ошибки и их заменяющие термины находятся в другом списке кортежей (chem_fix), чтобы сохранить порядок, в котором они проверяются. Некоторые фрагменты слов с орфографическими ошибками используются вместо полных слов, поэтому проверка не может быть простой ==
заявление.
Конечный продукт — это список кортежей, test_and_value_f
, с правильно написанными лабораторными тестами.
Соответствующие фрагменты кода:
chem_fix = [('A/G RATIO', 'A:G RATIO'), ('ALK', 'ALKALINE PHOSPHATASE'), ('ALT', 'ALT'), ('AST', 'AST'), ('BILI', 'BILIRUBIN,TOTAL'), ('BLIL', 'BILIRUBIN,TOTAL'), ('BUN/CREAT', 'BUN/CREAT RATIO'), ('BUN', 'BLOOD UREA NITROGEN'), ('CARBON', 'CO2'), ('GLOB', 'GLOBULIN'), ('RANDOM', 'GLUCOSE'), ('PROTEIN', 'TOTAL PROTEIN')]
fix_terms = [x[0] for x in chem_fix]
test_and_value_f = []
replaced = False
for lab_test, value in test_and_value:
for count, term_needing_fix in enumerate(fix_terms):
if term_needing_fix in lab_test:
test_and_value_f.append((chem_fix[count][1], value))
replaced = True
break
if replaced == False:
test_and_value_f.append((lab_test, value))
else:
replaced = False
Образец test_and_value
ввод: [(‘GLUCOSE’, ’77’), (‘BUN’, ’14’), (‘CREATININE’, ‘1.4’), (‘CALCULATED BUN/CREAT’, ’10’), (‘SODIUM’, ‘142’), (‘POTASSIUM’, ‘3.7’), (‘CHLORIDE’, ‘100’), (‘CARBON DIOXIDE’, ’30’), (‘CALCIUM’, ‘8.9’), (‘PROTEIN, TOTAL’, ‘6.5’), (‘ALBUMIN’, ‘3.4’), (‘CALCULATED GLOBIN’, ‘3.1’), (‘CALCULATED A/G RATIO’, ‘1.1’), (‘BILIRUBIN, TOTAL’, ‘0.7’), (‘ALKALINE PHOSPHATASE’, ’59’), (‘SGOT (AST)’, ‘3’)]
Образец test_and_value_f
вывод: [(‘GLUCOSE’, ’77’), (‘BLOOD UREA NITROGEN’, ’14’), (‘CREATININE’, ‘1.4’), (‘BUN/CREAT RATIO’, ’10’), (‘SODIUM’, ‘142’), (‘POTASSIUM’, ‘3.7’), (‘CHLORIDE’, ‘100’), (‘CO2′, ’30’), (‘CALCIUM’, ‘8.9’), (‘TOTAL PROTEIN’, ‘6.5’), (‘ALBUMIN’, ‘3.4’), (‘GLOBULIN’, ‘3.1’), (‘A:G RATIO’, ‘1.1’), (‘BILIRUBIN,TOTAL’, ‘0.7’), (‘ALKALINE PHOSPHATASE’, ’59’), (‘AST’, ‘3’)]
Есть ли более эффективный способ сделать это?
1 ответ
Вы можете использовать словарь вместо списка кортежей для chem_fix
, и тогда вы сможете избавиться от fix_terms. Тогда вы могли бы использовать search
из модуля re в понимании списка, а затем найдите все совпадения в словаре. И вы можете использовать оператор моржа для хранения всего, что возвращается из search
так как сначала вы должны убедиться, что это не None
. Вот пример этого:
# there’s already a function called “compile”
# “import re” used so it doesn’t get overwritten
pattern = re.compile('|'.join(chem_fix))
pattern_search = pattern.search # method will be looked up faster
test_and_value_f = [
(
chem_fix[m.group(0)]
if (m := pattern_search(lab_test)) is not None
else lab_test,
value
)
for lab_test, value in test_and_value
]
Выберите список кортежей, чтобы сохранить порядок, в котором происходит проверка. Нужно ли мне использовать упорядоченный dict, или порядок будет сохранен в обычном dict (работает Python 3.9). Предполагается, что чтение 3.6+ должно сохранять порядок вставки? ссылка
— подковы
Да, обычный диктант должен сохранять порядок вставки, если он равен 3.9. Так что
"|".join
вернет строку с терминами в том же порядке, что и в словаре, поэтому вам не придется писать шаблон вручную.— my_first_c_program
поскольку
value
одинаково в обеих ветках, вашelse
может применяться внутри выходного кортежа только к первому элементу.— Райндериен
Пришлось вручную разобрать это с помощью некоторого тестового кода, чтобы понять, как все сочетается друг с другом. Выучил: 1) как использовать if / else в понимании списка для определения значений кортежа[0] в списке кортежей 2) .join on a dict объединяет ключи 3) оператор моржа
— подковы