Как создать словарь со списком с помощью регулярных выражений и defaultdict - PullRequest
0 голосов
/ 13 октября 2019

Словарь ниже

my = [{'Name':'Super', 'Gender':'Male', 'UNNO':111234},
      {'Name':'Spider', 'Gender':'Male', 'UNNO':11123},
      {'Name':'Bat', 'Gender':'Female', 'UNNO':113456},
     {'Name':'pand', 'Gender':'Female', 'UNNO':13456}]

Уникальный номер - это значение ключа "UNNO" для каждого словаря.

Все номера UNNO ​​должны содержать 6 цифр.

Номер UNNO, начинающийся с 11, действителен только

Ожидаемый результат

my_dict_list = {'Male':['Super'], 'Female':['Bat']}

Оригинальный код без регулярных выражений

d = {}
for i in my:
    if str(i['UNNO']).startswith('11') and len(str(i['UNNO'])) == 6:
        # To get {'Male':['Super'], 'Female':['Bat']}
        d[i['Gender']] = [i['Name']]

Как писать с помощью регулярных выражений, пишет обычныевыражение, как дополнить с помощью defaultdict

import re
from collections import defaultdict

# regular expression
rx = re.compile(r'^(?=\d{6}$)(?P<Male>11\d+)|(?P<Female>11\d+)')

# output dict
output = defaultdict(list)

1 Ответ

0 голосов
/ 13 октября 2019

Чтобы использовать сопоставление регулярных выражений при решении вашей проблемы - используйте следующий подход:

import re
from collections import defaultdict

my_list = [{'Name': 'Super', 'Gender': 'Male', 'UNNO': 111234},
           {'Name': 'Spider', 'Gender': 'Male', 'UNNO': 11123},
           {'Name': 'Bat', 'Gender': 'Female', 'UNNO': 113456},
           {'Name': 'pand', 'Gender': 'Female', 'UNNO': 13456}]

genders = defaultdict(list)
pat = re.compile(r'^11\d{4}$')  # crucial pattern to validate `UNNO` number

for d in my_list:
    if pat.search(str(d['UNNO'])):
        genders[d['Gender']].append(d['Name'])

print(dict(genders))   # {'Male': ['Super'], 'Female': ['Bat']}
...