Обновите значение dict2 из dict1, но в определенном месте в dict2

Имея 2 словаря, я хочу вставить значения dict1 в dict2, но в определенное место в dict2.

Я задал аналогичный вопрос здесь который был решен следующим образом:

d = {k: v.replace(k, k+' '+dict1[k]) for k, v in dict2.items()}

Но мне интересно, как бы мы решили эту подобную проблему:

Словарь1

{
'apple': 'hard tasty', 'orange': 'soft tasty', 'banana': 'soft very-tasty'
}

Словарь2

{
 'apple': '<div class="a"></div>',
 'orange': '<div class="o"></div>',
 'banana': '<div class="b a"></div>'
 }

Вставьте значения dict1 в dict2 внутри переменной "class=", чтобы получилось:

{
 'apple': '<div class="a hard tasty"></div>',
 'orange': '<div class="o soft tasty"></div>',
 'banana': '<div class="b a soft very-tasty"></div>'
 }

person Paul Gwamanda    schedule 18.06.2018    source источник


Ответы (3)


Вы можете использовать re.sub:

import re
d = {'apple': 'hard tasty', 'orange': 'soft tasty', 'banana': 'soft very-tasty'}
d1 = {'apple': '<div class="a"></div>', 'orange': '<div class="o"></div>', 'banana': '<div class="b a"></div>'}
new_d = {a:re.sub('(?<=class\=")[\w+\s\-\_]+(?=")', lambda x:x.group()+' '+d[a], b) for a, b in d1.items()}

Выход:

{'apple': '<div class="a hard tasty"></div>', 'orange': '<div class="o soft tasty"></div>', 'banana': '<div class="b a soft very-tasty"></div>'}
person Ajax1234    schedule 18.06.2018
comment
@ Ajax1234, банан не возвращает точный результат в вопросе ОП. Не то, чтобы это имело значение в данном случае, поскольку порядок классов не должен иметь значения, но может быть чем-то, на что стоит обратить внимание. - person W Stokvis; 18.06.2018
comment
Итак, я протестировал это, и, похоже, он разделяет значения, разделенные символом -, т.е. если для d1, если <div class="b a"></div> равно <div class="b-test a"></div>, вывод равен <div class="b soft very-tasty-testing a"></div> - person Paul Gwamanda; 18.06.2018
comment
@PaulGwamanda Я обновил регулярное выражение в своем ответе. Пожалуйста, посмотрите мое недавнее редактирование. - person Ajax1234; 18.06.2018
comment
Фантастика, я сделал эту работу во всех своих наборах данных, мне нужно немного почитать о регулярном выражении, я всегда этого боялся: p - person Paul Gwamanda; 18.06.2018

Так же, как и ответ на ваш первый вопрос, вот мое решение с использованием re.sub:

import re

dict1 = {'apple': 'hard tasty', 'orange': 'soft tasty', 'banana': 'soft very-tasty'}

dict2 = {'apple': '<div class="a"></div>',
         'orange': '<div class="o"></div>',
         'banana': '<div class="b a"></div>'
        }

d = {k: re.sub(r'class="([\w\- ]+)"', r'class="\1 ' + dict1[k] + '"', v) for k,v in dict2.items()}

print(d)
# {
#  'apple': '<div class="a hard tasty"></div>',
#  'orange': '<div class="o soft tasty"></div>',
#  'banana': '<div class="b a soft very-tasty"></div>'
#  }
person Laurent H.    schedule 18.06.2018
comment
Я принял ответ ajax, я не смог заставить это работать с моими наборами данных Laurent - person Paul Gwamanda; 18.06.2018
comment
Это работает на моей стороне с вашими входными данными вашего поста. Можете ли вы сказать мне, что терпит неудачу на вашей стороне, пожалуйста? - person Laurent H.; 18.06.2018
comment
Конечно, мой набор данных выглядит так: dict1 = {'btn-orange': 'p-3', 'btn-red': 'btn-transparent text-underline', 'quadruple': 'border border-primary'} и dict2 = {'btn-orange': '<a class="btn btn-warning" href="#" role="button">[]</a>', 'btn-red': '<a class="btn btn-danger" href="#" role="button">[]</a>', 'quadruple': '<div class="col-lg-3">\n{}\n</div>'} - person Paul Gwamanda; 18.06.2018
comment
Я обновил свой ответ. Вы должны были указать свой набор данных в своем вопросе. - person Laurent H.; 19.06.2018
comment
Работает так же, как принятый ответ, спасибо. У меня есть несколько наборов данных, к которым я применял это - person Paul Gwamanda; 19.06.2018

first = {
'apple': 'hard tasty', 'orange': 'soft tasty', 'banana': 'soft very-tasty'
}

second = {
'apple': '<div class="a"></div>',
'orange': '<div class="o"></div>',
'banana': '<div class="b a"></div>'
}

for k, v in second.items():
    lst = v.split("\"", 2)
    second[k] = "{} {}\"{}".format("\"".join(lst[:-1]), first[k], lst[-1])

Вывод

 {
 'apple': '<div class="a hard tasty"></div>',
 'orange': '<div class="o soft tasty"></div>',
 'banana': '<div class="b a soft very-tasty"></div>'
 }
person Druta Ruslan    schedule 18.06.2018
comment
Этот подход хорош, но кажется, что я могу столкнуться с проблемой, если в нем есть другой тег с тегом "class\=", например, 'banana': '<div class="b a" role="button"></div>' станет <div class="b a soft very-tasty" role="button soft very-tasty"></div> - person Paul Gwamanda; 18.06.2018
comment
я меняю его, но он будет работать, только если класс является первым атрибутом - person Druta Ruslan; 18.06.2018