Как извлечь значения из словаря с условием - PullRequest
0 голосов
/ 28 сентября 2019

Мне нужно извлечь номер мобильного телефона из списка словарей с помощью регулярных выражений.

Нужно извлечь только из d [num]

Словарь:

d = [{'name': 'a', 'num': '9134567890','num2':'912311111'},
    {'name': 'd', 'num': '9134567890','num2':'5151'},
    {'name': 'b', 'num': '0134567890','num2':'51'},
    {'name': 'c', 'num': '9034567890','num2':'12'},
    {'name': 'm', 'num': '9034590','num2':'13'}
    ]
  1. Номер телефона является значением для ключа "num" для каждого словаря.
  2. Все номера телефонов должны содержать 10 цифр.
  3. Если номер телефона начинается с 91, это 'local'.
  4. Если номер телефона начинается с 01, это 'global'.
  5. Если номер телефона начинается с чего-либо еще, это 'others'.

Псевдокод:

s = {'locals':[], 'global':[], 'others':[]}
for i in d:
    for k,v in i.items():
        #if num starts with 91:
           #append locals
        #elif num starts with 01:
           #append to globals
        #else:
            #append to others

Псевдокод

for i in my_dict_1:
    print ([ v for k,v in i.items() if str(v).startswith('91') if i['num']])

Мой ожидаемый результат:

{'locals':[a,d], 'global':['b'], 'others':['d']}

С момента вопросаПрикоснись Я решил вопрос

s = {'locals':[], 'global':[],'others':[]}
for i in d:
    if i['num'].startswith('91'):
        s['locals'].append(i['num'])
    elif i['num'].startswith('01'):
        s['global'].append(i['num'])
    else:
        s['others'].append(i['num'])
s

Out

{'global': ['0134567890'],
 'locals': ['9134567890', '9134567890'],
 'others': ['9034567890', '9034590']}

Ответы [ 2 ]

0 голосов
/ 29 сентября 2019

@ Jan

Я все еще новичок в регулярных выражениях в Python.Не следует ли исключить число «9034590» в «других», поскольку оно не содержит десяти цифр?Как вы исправите ^(?=\d{10}$) часть вашего rx?

Я изменил эту строку на (по общему признанию, не лучшее исправление, но она все еще работает)

rx = re.compile(r'(?P<local>91\d{8})|(?P<global>01\d{8})|(?P<others>\d{10})')

Это дает

defaultdict(<class 'list'>, {'local': ['9134567890', '9134567890'], 'global': ['0134567890'], 'others': ['9034567890']})

в соответствии с просьбой автора.

Редактировать: Я понял это (лучшее решение), @Jan вы пропустили скобки для трех выражений или .

rx = re.compile(r'^(?=\d{10}$)((?P<local>91\d+)|(?P<global>01\d+)|(?P<others>\d+))')
0 голосов
/ 29 сентября 2019

Вы можете использовать регулярное выражение с чередованием и defaultdict как в:

from collections import defaultdict
import re

d = [
    {'name': 'a', 'num': '9134567890','num2':'912311111'},
    {'name': 'd', 'num': '9134567890','num2':'5151'},
    {'name': 'b', 'num': '0134567890','num2':'51'},
    {'name': 'c', 'num': '9034567890','num2':'12'},
    {'name': 'm', 'num': '9034590','num2':'13'}
]

# regular expression
rx = re.compile(r'^(?=\d{10}$)(?P<local>91.+)|(?P<global>01.+)|(?P<others>.+)')

# output dict
output = defaultdict(list)

# list comprehension
_ = [output[key].append(m[key])
     for item in d
     for m in [rx.search(item["num"])] if m
     for key in m.groupdict() if m[key]]

print(output)

Это дает

defaultdict(<class 'list'>, {'local': ['9134567890', '9134567890'], 'global': ['0134567890'], 'others': ['9034567890', '9034590']})


Регулярное выражение гарантирует, что точно10 цифр (это то, что делает положительный прогноз), а затем помещает различные совпадения в соответствующие группы.После этого мы проверяем, какой диктат был заполнен в большом понимании.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...