Как заменить только часть слова из строки в Python - PullRequest
0 голосов
/ 20 февраля 2020

У меня есть список названий улиц

streetNames = ['WELSESTRAAT', 'HENDRIKLAAN', 'LOMMERWEG']

И еще один список с аббревиатурами улиц

streetAbbr = [['WEG', 'WG'], ['STRAAT', 'STR'],['LAAN', 'LN']]

Я пытаюсь l oop просмотреть названия улиц и заменить straat на str , weg с wg и так далее, но я застрял в заменяющей части, поскольку такого метода нет только для части слова.

for name in streetNames:
    for abbr in streetAbbr:
        if str(abbr[0]) in str(name):
            name.replace('straat', abbr[1]) #doesn't work 

Ответы [ 3 ]

2 голосов
/ 20 февраля 2020

Проблема в вашем коде заключается в том, что вы заменяете переменную, по которой вы выполняете итерацию, что никак не влияет на исходный список. Вместо этого переназначьте список, проиндексировав его:

d = dict(streetAbbr)
# {'WEG': 'WG', 'STRAAT': 'STR', 'LAAN': 'LN'}

for k,v in d.items():
    for i, name in enumerate(streetNames):
        if k in name:
            streetNames[i] = name.replace(k, v)

print(streetNames)
# ['WELSESTR', 'HENDRIKLN', 'LOMMERWG']
1 голос
/ 20 февраля 2020

Проблема здесь в том, что функция replace() находит пустое место для замены строк. Поскольку в вашем массиве есть только одно слово, оно не работает.

@ Yatu ответ правильный, но в случае, если вы не хотите обновлять структуры данных в вашем коде, вы можете использовать это решение для конкретного случая использования c.

for name in streetNames:
    for abbr in streetAbbr:
        if abbr[0] in name:
            new_str = name.split(abbr[0])
            name = f"{new_str[0]}{abbr[1]}" 
            print(name)

Это решение может не работать, если в именах есть несколько вхождений одной и той же подстроки из-за использования split. Но поскольку в этом вопросе нет таких примеров, предполагалось, что это должно сработать.

1 голос
/ 20 февраля 2020
result = [name.replace(abbr[0], abbr[1]) for name in streetNames for abbr in streetAbbr if abbr[0] in name]    
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...