Python 字典理解包含在另一个字典中找不到的项目列表

Python dictionary comprehension to contain list of items not found in another dictionary

有一个列表和一个字典。如果列表中的项目不存在于字典中,则将该项目添加到新字典中。下面是我试图转换为字典理解的 for 循环。

for i in range(1, len(list_a)):
    if dict_main.get(list_a,'') == '':
        dict_new[list_a[i]] = None

词典理解方法如下

dict_new = {list_a[i] if dict_main.get(list_a[i], '') == '' else None: None for i in range(1, len(list_a))}

理解工作正常,但它添加了一个额外的 (None, None) 键值对。如果 else 被删除,它会抛出 'else expected' 错误。请指导我。

您的常规循环代码中存在几个问题:

  • 列表索引从 0 开始,因此您应该写 for i in range(0, len(list_a)) 否则您将错过列表的第一个元素。
  • 一个可能的错字:dict_main.get(list_a,'') 应该是 dict_main.get(list_a[i],'')
  • 如果字典中有映射 x: '' 会怎样? dict_main.get(x, '') returns '' 并将映射 x: None 添加到 dict_new。使用 x not in d 检查键 x 是否未映射到 d.
  • 中的值
  • 这不是真正的问题,但在 Python 中,如果不需要索引(如果需要索引,enumerate 很有用)。

经验法则是:首先,修复正则循环,然后创建一个 list/dict 理解。这是固定的常规循环:

for x list_a:
    if x not in dict_main:
        dict_new[x] = None

因此字典理解(@Kenny Ostrom 在评论中给出):

dict_new = {x: None for x in list_a if x not in dict_main}

如果你真的需要生成一个值为 None 的字典,你可以使用 dict.fromkeys 和一组键:

dict_new = dict.fromkeys(x for x in list_a if x not in dict_main)

或者,也许更清楚:

dict_new = dict.fromkeys(set(list_a) - set(dict_main))

你的听写理解试验没有被过滤(最后没有 if)。它在目标字典中创建 len(list_a) 个键,全部映射到 None。如果 dict_main.get(list_a[i], '') == ''(元素不在 dict_main 中或映射到 ''),则这些键是列表的元素,否则 None.

如果列表的多个元素是 dict_main 的键,映射 None: None 添加一次然后覆盖,因为字典的键是唯一的。这就是为什么只要列表中至少有一个元素是 dict_main.[=43= 的键,就会在字典的末尾有一个(而且只有一个)额外的 None: None ]