пропуск слов / цифр в словаре с использованием списка - PullRequest
1 голос
/ 01 октября 2019

У меня есть список e

e = ['s', 'mm', 'ng']

и дикт d

d = {'A1': ['Tomas', 
            'john',
 '2s',
 'Douglas',
    '20ng'],      
 'B1': ['Tomm',        
 '3mm',
 'Sterling',
       'hey']}

Моя цель - пропустить только имена в d, заканчивающиеся цифройи элемент из e.

Например, 2s из d будет пропущено, поскольку оно содержит цифру 2 и элемент s из списка e.

Я пробовал следующее

r = {}
for k, v in d.items():
    r[k] = [s for s in v if not any(s.endswith(val) for val in e)]  

И я получаю

{'A1': ['john'], 'B1': ['hey']}

У меня есть код, удаляющий элементы, заканчивающиеся s например 'Tomas'

Мой желаемый вывод - это следующее, в котором удалены только цифры + элементы из e Например, 3mm

{'A1': ['Tomas', 'john', 'Douglas'], 'B1': ['Tomm', 'Sterling', 'hey']}

Как изменить код для получения желаемого результата?

Ответы [ 2 ]

1 голос
/ 01 октября 2019

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

\ds$

или

\dng$

Мы можем построить это, используя конкатенацию строк с val, а затем использовать его при вызове re.search, чтобы определить, соответствует ли значение:

import re

e = ['s', 'mm', 'ng']
d = {'A1': ['Tomas', 
            'john',
 '2s',
 'Douglas',
    '20ng'],      
 'B1': ['Tomm',        
 '3mm',
 'Sterling',
       'hey']}
r = {}
for k, v in d.items():
    r[k] = [s for s in v if not any(re.search('\d' + val + '$', s) for val in e)]  
print (r)

Вывод:

{'A1': ['Tomas', 'john', 'Douglas'], 'B1': ['Tomm', 'Sterling', 'hey']}
1 голос
/ 01 октября 2019

Возможно, это может быть близко к тому, что вы имеете в виду,

import re
e = ['s', 'mm', 'ng']

d = {'A1': ['Tomas',
            'john',
            '2s',
            'Douglas',
            '20ng'],
     'B1': ['Tomm',
            '3mm',
            'Sterling',
            'hey']}
r = {}
for k, v in d.items():
    r[k] = [s for s in v if not any(re.match(r'^[0-9]', s) for val in e)]

print(r)

Вывод

{'A1': ['Tomas', 'john', 'Дуглас '],' B1 ': [' Tomm ',' Sterling ',' hey ']}

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

re.match(r'^[0-9]', s)

и включите это в утверждение if not, которое вы уже имели в своем понимании списка.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...