在Python中使用列表理解与词典
我想让我的头绕着列表解析,我可以理解他们如何工作的基础知识,但我觉得我应该能够在这里做我的代码的东西,我只是似乎无法工作。在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语句,而且我读过的所有内容都没有帮助回答/如果这是可能的。
在您的第一个片段中,您基本上默认所有节点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中,包含所有键的列表,使得在Python 3中搜索多余的效率低下,创建了字典视图)。总是在那里使用较短的形式。
请注意您在d
中用作值的set
对象现在与dag
共享;您对这些设置所做的任何更改都会反映在两个字典中。然后
创建节点的序列没有值将是:
nodes_without_exits = [node for node, edges in d.items() if not node]
列表解析仍然需要生产者表达,产生该值被插入到列表中的一部分;这里是node
,这个列表是用字典的键构建的。
如果你想保持有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)
和蟒蛇三是不必要的函数调用。
清晰度比简短性要好,所以只有在清晰度更高或清晰度更高的情况下才能缩短清晰度。这在Python中也往往很快。 –