Как найти и заменить значения в одном словаре на основе другого - PullRequest
2 голосов
/ 14 апреля 2019

Прежде всего, я хочу сказать, что вопрос, который я задал, трудно задать «компактным» образом, поэтому некоторые вещи будут объяснены ниже.

У меня есть два словаря, скажем такэто regex = {} и dict = {}.

Первый из них содержит шаблоны поиска и замены соответственно как keys и values.Так это выглядит так:

# about 50 key/value pairs
regex = {
    'find1' : 'replace1',
    'find2' : 'replace2',
    ...
    'findX' : 'replaceX'
}

Второй выглядит так:

# about 500,000 key/value pairs
dict = {
    'key1' : 'value1',
    'key2' : 'value2',
    ...
    'keyX' : 'valueX'
}

Для каждого keyX, valueX из dict Я хочу проверить, еслиvalueX включает findX из regex, если да, я хочу заменить его на replaceX и сохранить в том же (dict) или новом словаре или списке (использовал новый список в коде ниже),

Я пробовал с этим кодом:

for keyX, valueX in dict.items():
    for patterns in regex.items():
        if re.search(patterns[0], valueX)
            new_value = re.sub(patterns[0], patterns[1], valueX)

    new_line = keyX + '\t' + new_value

    new_list.append(new_line)

Мой механизм работает неправильно: для каждого valueX он должен проверять, содержит ли он какой-либо из findX, заменить его на replaceX, сохраните, но вместо этого я получаю беспорядок в списке вывода.Дубликаты new_value с для разных keyX с.Я знаю, что что-то не так с итерацией по моим словарям (вероятно, по словарю регулярных выражений), но я не знаю, как это исправить.


РЕДАКТИРОВАТЬ (примеры):

regex = {
   's t n': 's n',
   'e0': 'i0',
   'j a0': 'j i0'
}

dict = {
    'известный': 'i0 z vj e1 s t n y0 j',
    'сестра': 'sj e0 s t r a1'
    'январь': 'j a0 n v a1 rj'
}

Ответы [ 2 ]

1 голос
/ 14 апреля 2019

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

# init vars
regex = {'s t n': 's n', 'e0': 'i0', 'j a0': 'j i0'}
d = {'известный': 'i0 z vj e1 s t n y0 j', 'сестра': 'sj e0 s t r a1', 'январь': 'j a0 n v a1 rj'}
# debug prints
print(regex)
print(d)
# get keys for replacements
import itertools
tuples = list(itertools.chain.from_iterable([[(keyx, findx) for keyx in d.keys() if findx in d[keyx]] for findx in regex.keys()]))
# loop and replace
for keyx, findx in tuples:
    d[keyx] = d[keyx].replace(findx, regex[findx])
# print output
print(d)

Выход:

{'s t n': 's n', 'e0': 'i0', 'j a0': 'j i0'}
{'известный': 'i0 z vj e1 s t n y0 j', 'сестра': 'sj e0 s t r a1', 'январь': 'j a0 n v a1 rj'}
{'известный': 'i0 z vj e1 s n y0 j', 'сестра': 'sj i0 s t r a1', 'январь': 'j i0 n v a1 rj'}
1 голос
/ 14 апреля 2019

Попробуйте:

regex = {
   's t n': 's n',
   'e0': 'i0',
   'j a0': 'j i0'
}

dict = {
    'известный': 'i0 z vj e1 s t n y0 j',
    'сестра': 'sj e0 s t r a1',
    'январь': 'j a0 n v a1 rj'
}
for k1,v1 in regex.items():
    for k2,v2 in dict.items():
        if k1 in v2:
            dict[k2]=dict[k2].replace(k1,v1)

И вы получите:

dict

{'известный': 'i0 z vj e1 s n y0 j',
 'сестра': 'sj i0 s t r a1',
 'январь': 'j i0 n v a1 rj'}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...