用Python删减列表字典

2024-03-28 20:08:23 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在为Python中的一个anagram程序使用字典。键是已排序字母的元组,值是包含这些字母的可能单词的数组:

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

我正在使用regex来过滤列表。因此,给定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}

我确信有一种方法可以一步到位,但我还没弄明白。有办法把它们结合起来吗?或者一个更好的方法?你知道吗


Tags: 方法inforif字母items单词sat
2条回答

一个班轮,像这样的?你知道吗

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)}

分两步完成这项工作很好,而且可能有利于可读性。你知道吗

但是为了回答你的问题,这里有一行(为了可读性,分成多行)。它使用生成器表达式从第一步生成对。你知道吗

{
  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']}

相关问题 更多 >