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
]
有一个列表和一个字典。如果列表中的项目不存在于字典中,则将该项目添加到新字典中。下面是我试图转换为字典理解的 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
]