У меня есть список подстрок:
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']
Что с [0]
? Почему это там? Не заменит ли это карту картой, состоящей из одного элемента?
Кажется, этот способ работает для меня. Вот онлайн-тест: 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
Этот ответ не дает ожидаемого результата. Последняя строка не преобразуется с использованием Словаря, поскольку предлагаемый код использует тот случайный факт, что для последовательности первых четырех строк используемая запись Словаря имеет тот же порядок, что и в Списке.
По сути, ответ @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]
Вам необходимо добавить тег для языка. Это Питон?