我试图理解列表理解,我可以理解它们如何工作的基础知识,但我觉得我应该能够在这里使用我的代码做一些我不能做的事情。似乎开始工作了。
给出一本字典:
{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]:
但这一直告诉我它需要一个别的陈述,而我所读过的内容并没有帮助回答如何/如果可能的话。
答案 0 :(得分:1)
如果要保留具有falsey值的键,则语法为:
[ k for k, v in d.items() if not v]
这相当于你最后一个循环栏d.pop(k)
,我不确定你是否愿意。第一个k
是我们附加到列表中的内容,for k, v
是d.items中的每个键和值,而if not v
表示我们只保留具有虚假值的k&#39。
如果你真的想要一个没有这些键和值的字典你可以使用字典理解,其中逻辑完全相同,除了我们创建键/值配对而不是只保留列表理解中的键:
{ k:v for k, v in d.items() if not v}
至于你的第一个代码,我不确定你想要它做什么,但你不应该在python2中调用.keys
,它创建一个列表并进行查找O(n)
而不是{ {1}}在python 3中,这是一个不必要的函数调用。
答案 1 :(得分:1)
在您的第一个代码段中,您基本上将None
中的所有节点默认为dag
。您可以反转这些步骤,避免测试已经存在的密钥:
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中,包含所有键的列表,使搜索 extra 效率低下,在Python 3中创建了一个字典视图)。总是在那里使用较短的形式。
请注意,您在set
中用作值的d
对象现已与dag
共享;您对这些集合所做的任何更改都将反映在两个词典中。
创建没有值的节点序列将是:
nodes_without_exits = [node for node, edges in d.items() if not node]
列表推导仍然需要生成器表达式,即生成要插入列表的值的部分;这里是node
,列表是根据字典的键构建的。