Заменить подстроки в списке строк, используя словарь в Python

У меня есть список подстрок:

ls = ['BLAH a b c A B C D 12 34 56',
    'BLAH d A B 12 45 78',
    'BLAH a/b A B C 12 45 78',
    'BLAH a/ b A  12 45 78',
    'BLAH a b c A B C D 12 34 99']

Я хочу заменить подстроки нижнего регистра идентификатором:

dict2 = {'a b c':'1','d':'2','a/b':'3','a/ b':'4'}

Я перебираю все элементы в списке и пытаюсь выполнить замену, используя:

[[ls[i].replace(k,v) for k,v in dict2.items()][0] for i in range(len(ls))]

но это не выполняет правильную замену из словаря для каждого элемента (d, a/b и a/ b не были заменены) и приводит к:

['BLAH 1 A B C D 12 34 56', 
'BLAH d A B 12 45 78', 
'BLAH a/b A B C 12 45 78', 
'BLAH a/ b A  12 45 78', 
'BLAH 1 A B C D 12 34 99']

Я хотел бы закончить:

['BLAH 1 A B C D 12 34 56',
    'BLAH 2 A B 12 45 78',
    'BLAH 3 A B C 12 45 78',
    'BLAH 4 A  12 45 78',
    'BLAH 1 A B C D 12 34 99']

Вам необходимо добавить тег для языка. Это Питон?

RoToRa 08.07.2024 15:44

Что с [0]? Почему это там? Не заменит ли это карту картой, состоящей из одного элемента?

Maarten Bodewes 08.07.2024 15:51
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
2
2
81
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

Кажется, этот способ работает для меня. Вот онлайн-тест: https://www.pythonmorsels.com/p/2qmeh/

result = []
for s in ls:
    for k, v in dict2.items():
        s = s.replace(k, v)
    result.append(s)

print(result)
ls = ['BLAH a b c A B C D 12 34 56',
    'BLAH d A B 12 45 78',
    'BLAH a/b A B C 12 45 78',
    'BLAH a/ b A  12 45 78',
    'BLAH a b c A B C D 12 34 99']

dict2 = {'a b c':'1','d':'2','a/b':'3','a/ b':'4'}

оригинальный ответ:

[[ls[i].replace(k,v) for k,v in dict2.items()][i] for i in range(len(ls)-1)]

#выход

['BLAH 1 A B C D 12 34 56',
 'BLAH 2 A B 12 45 78',
 'BLAH 3 A B C 12 45 78',
 'BLAH 4 A  12 45 78']

Обновлено: ответ @Kumin правильный, поскольку последний элемент отсутствовал при использовании понимания списка:

for s in ls:
    for k, v in dict2.items():
        s = s.replace(k, v)
    print(s)

#выход

BLAH 1 A B C D 12 34 56
BLAH 2 A B 12 45 78
BLAH 3 A B C 12 45 78
BLAH 4 A  12 45 78
BLAH 1 A B C D 12 34 99

Этот ответ не дает ожидаемого результата. Последняя строка не преобразуется с использованием Словаря, поскольку предлагаемый код использует тот случайный факт, что для последовательности первых четырех строк используемая запись Словаря имеет тот же порядок, что и в Списке.

user19077881 08.07.2024 17:06

По сути, ответ @Im Kumin понятен:

md = list(dict2.items()) # Avoids re-computing this for each string

result = [functools.reduce(lambda s,m:s.replace(m[0],m[1]), [line]+md) for line in ls]

Другие вопросы по теме