我正在使用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}
我确信有一种方法可以一步完成这些,但我还没想出来。有没有办法将它们结合起来?或者更好的方法来做到这一点?
答案 0 :(得分:4)
分两步完成这项工作很好,可能对可读性有好处。
但是要回答你的问题,这里是一个单行(为了便于阅读,分为多行)。它使用生成器表达式从第一步生成对。
{
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']}
答案 1 :(得分:4)
对于单线,这样的事情?
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)}