Уборка словаря списков в Python
Я работаю со словарем для программы анаграммы на Python. Ключи - это кортежи отсортированных букв, а значения - это массивы возможных слов с этими буквами:
wordlist = {
('d', 'g', 'o'): ['dog', 'god'],
('a', 'c', 't'): ['act', 'cat'],
('a', 's', 't'): ['sat', 'tas'],
}
Я использую регулярное выражение для фильтрации списка вниз. Так дано r't$'
в качестве фильтра конечный результат должен быть:
filtered_list = {
('a', 'c', 't'): ['act', 'cat'],
('a', 's', 't'): ['sat'],
}
До сих пор я понизил это до двух шагов. Во-первых, сохраните все слова, которые соответствуют выражению:
tmp = {k: [w for w in v if re.search(r't$', w)] for k, v in wordlist.items()}
Это оставляет меня с пустыми списками:
{
('d', 'g', 'o'): [],
('a', 'c', 't'): ['act', 'cat'],
('a', 's', 't'): ['sat'],
}
Затем мне нужен второй проход, чтобы избавиться от пустых списков:
filtered_list = {k: v for k, v in tmp.items() if v}
Я уверен, что есть способ сделать это за один шаг, но я еще не понял это. Есть ли способ объединить их? Или лучший способ сделать это в целом?
2 ответа
Делать это в два этапа хорошо, и, вероятно, хорошо для удобства чтения.
Но чтобы ответить на ваш вопрос, вот одна строка (разбитая на несколько строк, для удобства чтения). Он использует выражение генератора для генерации пар из первого шага.
{
k:v for k, v in
(
(kk, [w for w in vv if re.search(r't$', w)])
for kk, vv in wordlist.items()
)
if v
}
=> {('a', 'c', 't'): ['act', 'cat'], ('a', 's', 't'): ['sat']}
Для однострочника что-то вроде этого?
A = {k:[w for w in v if re.search(r't$', w)] for k,v in wordlist.items() if any(re.search(r't$', w) for w in v)}