[英]Using List Comprehension with Dictionaries in Python
我试图了解列表理解,我可以理解它们的工作原理,但是我觉得我应该可以在这里用我的代码做些我似乎无法工作的事情。
给定字典:
{2: {11}, 9: {11, 8, 10}, 10: {11, 3}, 11: {7, 5}, 8: {7, 3}}
如果我更了解,我觉得可以减少一些摘要:
for k, v in d.items():
dag[k] = v
for val in v:
if val not in d.keys():
dag[val] = None
和:
t = []
for k, v in d.items():
if not v:
t.append(k)
d.pop(k)
我的尝试是:
for [k, v in d.items() if not v]:
但这一直告诉我它需要一个else语句,而我所读的内容都没有帮助回答如何/是否可能。
如果要保留具有假值的键,则语法为:
[ k for k, v in d.items() if not v]
那相当于您最后一个循环条d.pop(k)
,我不确定是否要。 第一个k
是我们追加到列表中的内容, for k, v
是d.items中的每个键和值, if not v
意味着我们仅保留具有假值的k。
如果您实际上想要不带这些键和值的字典,则可以使用dict理解,其逻辑完全相同,只是我们创建键/值对,而不仅仅是将键保留在列表中:
{ k:v for k, v in d.items() if not v}
至于您的第一个代码,我不确定您希望它执行什么操作,但是您不应该在python2中调用.keys
,它会创建一个列表并进行查找O(n)
而不是0(1)
和python 3这是不必要的函数调用。
在第一个代码段中,实际上是将dag
中的所有节点默认为None
。 您可以反转这些步骤,并避免测试已完全存在的密钥:
dag = dict.fromkeys(node for v in d.values() for node in v)
dag.update(d)
这将创建一个字典,其中包含给定键的所有None
值(源自生成器表达式),然后进行更新以插入所有已知边。
在您的代码中,您使用了if val not in d.keys()
; 这是功能上等同于if val not in d
,但没有冗余呼叫到d.keys()
它创建了一个新的对象(在Python 2,所有键列表,使搜索额外效率低下,在Python 3字典视图已创建)。 始终在此处使用较短的形式。
请注意,现在与dag
共享了您在d
中用作值的set
对象; 您对这些集合所做的任何更改都会反映在两个词典中。
创建没有值的节点序列将是:
nodes_without_exits = [node for node, edges in d.items() if not node]
列表理解仍然需要生产者表达式 ,即产生值的部分要插入到列表中; 这里是node
,列表是根据字典的键构建的。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.