在Python中使用列表理解与词典

时间:2015-05-04 10:51:08

标签: python dictionary list-comprehension

我试图理解列表理解,我可以理解它们如何工作的基础知识,但我觉得我应该能够在这里使用我的代码做一些我不能做的事情。似乎开始工作了。

给出一本字典:

{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]:

但这一直告诉我它需要一个别的陈述,而我所读过的内容并没有帮助回答如何/如果可能的话。

2 个答案:

答案 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,列表是根据字典的键构建的。