Возвращает совпадающее значение из подстроки в списке со словарем, содержащим подстроку

#python

#python

Вопрос:

У меня есть список словарей, как показано ниже.

 [{'cvid': '642', 'switch': '015ABC003999FR', 'uni': '5'},
 {'cvid': '523', 'switch': '017ABC001230FR', 'uni': '5'},
 {'cvid': '43', 'switch': '017ABC001231FR', 'uni': '2'},
 {'cvid': '45', 'switch': '500ABC005437FR', 'uni': '3'}]
  

У меня также есть список, содержащий значения, подобные приведенным ниже.

 [['000015ABC003999CIRC'], ['000017ABC001230CIRC'], ['000017ABC001231CIRC'], ['000015ABC000249CIRC'], ['000500ABC005437CIRC']]
  

Я хотел бы иметь возможность извлекать подстроку из значения {‘switch’:’015ABC003999FR’} и возвращать значение 000015ABC003999CIRC и добавлять его в тот же словарь, что и {‘circ’:’000015ABC003999CIRC’}.

Я не смог найти пример, близкий к этому сценарию. Возможно ли сделать подобное регулярное выражение для 015ABC003999 словаря, а затем также сопоставить с регулярным выражением списка? Я думаю, что другим вариантом было бы просто создать значение, добавив нули в начало и заменив FR на CIRC, но я бы предпочел сопоставить со списком в качестве своего рода проверки.

Затем я бы использовал словарь для заполнения конфигураций, подобных приведенным ниже

 print('cfm service delete service '   dic['switch'])
print('cfm mep create service '   dic['circ']   ' port '    dic['uni']   ' type up vlan '    dic['cvid']   ' mepid 3')
  

Комментарии:

1. Что вы подразумеваете под «но я бы предпочел сопоставить со списком в качестве своего рода проверки».?

2. Каков ожидаемый результат?

3. На случай, если устройство, с которого я создаю словарь, имеет дополнительные схемы. Я думаю, список похож на известное благо. Также добавлена конечная цель.

Ответ №1:

Вы можете просто перебрать оба в двух циклах for , похоже, вам нужно удалить последние два символа switch значений перед проверкой подстроки с помощью in :

 import json

data = [
          {
            "cvid": "642",
            "switch": "015ABC003999FR",
            "uni": "5"
          },
          {
            "cvid": "523",
            "switch": "017ABC001230FR",
            "uni": "5"
          },
          {
            "cvid": "43",
            "switch": "017ABC001231FR",
            "uni": "2"
          },
          {
            "cvid": "45",
            "switch": "500ABC005437FR",
            "uni": "3"
          }
        ]

lst = [['000015ABC003999CIRC'], ['000017ABC001230CIRC'], ['000017ABC001231CIRC'],
      ['000015ABC000249CIRC'], ['000500ABC005437CIRC']]

for d in data:
  switch_val_without_last_2_ch = d["switch"][:-2]
  for sub_lst in lst:
    val = sub_lst[0]
    if switch_val_without_last_2_ch in val:
      d["circ"] = val
      break

print(json.dumps(data, indent=2, sort_keys=False))

for dic in data:
  print(f'cfm service delete service {dic["switch"]}')
  print(f'cfm mep create service {dic["circ"]} port {dic["uni"]} type up vlan {dic["cvid"]} mepid 3')
  

Вывод:

 [
  {
    "cvid": "642",
    "switch": "015ABC003999FR",
    "uni": "5",
    "circ": "000015ABC003999CIRC"
  },
  {
    "cvid": "523",
    "switch": "017ABC001230FR",
    "uni": "5",
    "circ": "000017ABC001230CIRC"
  },
  {
    "cvid": "43",
    "switch": "017ABC001231FR",
    "uni": "2",
    "circ": "000017ABC001231CIRC"
  },
  {
    "cvid": "45",
    "switch": "500ABC005437FR",
    "uni": "3",
    "circ": "000500ABC005437CIRC"
  }
]
cfm service delete service 015ABC003999FR
cfm mep create service 000015ABC003999CIRC port 5 type up vlan 642 mepid 3
cfm service delete service 017ABC001230FR
cfm mep create service 000017ABC001230CIRC port 5 type up vlan 523 mepid 3
cfm service delete service 017ABC001231FR
cfm mep create service 000017ABC001231CIRC port 2 type up vlan 43 mepid 3
cfm service delete service 500ABC005437FR
cfm mep create service 000500ABC005437CIRC port 3 type up vlan 45 mepid 3
  

Попробуйте repl.it