2015-05-04 96 views
0

我想让我的头绕着列表解析,我可以理解他们如何工作的基础知识,但我觉得我应该能够在这里做我的代码的东西,我只是似乎无法工作。在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语句,而且我读过的所有内容都没有帮助回答/如果这是可能的。

+0

清晰度比简短性要好,所以只有在清晰度更高或清晰度更高的情况下才能缩短清晰度。这在Python中也往往很快。 –

回答

1

在您的第一个片段中,您基本上默认所有节点Nonedag。你可以颠倒这些步骤,并避免测试键已经存在共:

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中搜索多余的效率低下,创建了字典视图)。总是在那里使用较短的形式。

请注意您在d中用作值的set对象现在与dag共享;您对这些设置所做的任何更改都会反映在两个字典中。然后

创建节点的序列没有值将是:

nodes_without_exits = [node for node, edges in d.items() if not node] 

列表解析仍然需要生产者表达,产生该值被插入到列表中的一部分;这里是node,这个列表是用字典的键构建的。

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。

如果你真的想没有那些键和值的字典,你可以使用字典理解其中的逻辑是完全一样的,除了我们正在创建的键/值配对,而不只是仅保留在列表中理解的关键:

{ k:v for k, v in d.items() if not v} 

关于你的第一个代码,我不知道你想让它做什么,但你不应该叫.keys,在创建一个列表和使python2查找O(n),而不是0(1)和蟒蛇三是不必要的函数调用。