削减Python中的列表字典

phr*_*tyl 7 python dictionary list-comprehension dictionary-comprehension

我正在使用Python中的字谜程序字典.键是排序字母的元组,值是具有这些字母的可能单词的数组:

wordlist = {
   ('d', 'g', 'o'): ['dog', 'god'],
   ('a', 'c', 't'): ['act', 'cat'],
   ('a', 's', 't'): ['sat', 'tas'],
}
Run Code Online (Sandbox Code Playgroud)

我正在使用正则表达式来过滤列表.因此,r't$'作为过滤器,最终结果应为:

filtered_list = {
   ('a', 'c', 't'): ['act', 'cat'],
   ('a', 's', 't'): ['sat'],
}
Run Code Online (Sandbox Code Playgroud)

到目前为止,我已经把它归结为两步了.首先,保留与表达式匹配的所有单词:

tmp = {k: [w for w in v if re.search(r't$', w)] for k, v in wordlist.items()}
Run Code Online (Sandbox Code Playgroud)

这给我留下了空列表:

{
   ('d', 'g', 'o'): [],
   ('a', 'c', 't'): ['act', 'cat'],
   ('a', 's', 't'): ['sat'],
}
Run Code Online (Sandbox Code Playgroud)

然后我需要第二遍来摆脱空列表:

filtered_list = {k: v for k, v in tmp.items() if v}
Run Code Online (Sandbox Code Playgroud)

我确信有一种方法可以一步完成这些,但我还没想出来.有没有办法将它们结合起来?或者更好的方法来做到这一点?

shx*_*hx2 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']}
Run Code Online (Sandbox Code Playgroud)