【发布时间】:2019-01-31 21:07:58
【问题描述】:
我有一个采用边列表的方法,边具有这种形式:(v1,v2,capacity) 并返回这种形式的字典:
dico = {v1:{v2:capacity,v3:capacity} v2:...}
这个dico 代表一个图
我想通过理解的方式定义这个 dico,但我真的被阻止了,我什至不确定我们是否可以这样做,所以有人可以告诉我这是否可能吗? 这是我的功能:
def _init_from_edges(self, edges):
self._G={}
for e in edges:
if e[0] in self._G:
self._G[e[0]][e[1]]=e[2]
else:
self._G[e[0]]={e[1]:e[2]}
【问题讨论】:
-
不知道为什么你会被驱使去使用理解(对我来说,这是 Python 的那些特性之一,在我看来,它似乎更多地是由“gee-whiz we can do this in a single line”而不是需要可维护的代码)当您显示的代码非常简单时 - 尽管我看不到它在哪里创建 v3:capacity 除非您在边缘列表中重复此操作。请显示您为边缘列表假设的一些示例内容。
-
事实上,请在您的问题中编辑您当前代码的最小完整可验证示例stackoverflow.com/help/mcve
-
@barny:一般的理解没有错。 当他们做简单的事情时,它们(通常)更快,并且(通常)比等效循环更易于阅读。正确使用(作为无副作用的功能构造),它们向维护者暗示代码足够简单,可以作为一个输入到另一个输入的简单过滤器/转换(其中正常循环不受限制) -影响,即使按照惯例)。也就是说,我同意 OP 的特殊情况不会从理解中受益;它可以工作,但不应该。
-
我对理解的功能或速度没有任何抱怨,当它们不起作用时,它们对调试的不可渗透性 - 即它们的不可维护性 - 使它们成为我很少使用的 Python 功能。我不想鼓励任何人将它们用于真正的代码。为了好玩,为了教育,很好——递归是类似的——但不适用于其他人可能必须尝试理解和更新的真实代码。
-
我今天遇到了这个问题——我不认为这是使用推导式的一个闪亮的理由,因为这两行代码很容易使用一个 for 循环和一个额外的行来实现更清楚。
empty_props = [p for p,v in list(self.predicates.items()) if not v] list(map(lambda k: self.predicates.pop(k, None), empty_props))与第二行构造一个未使用的列表仅作为一种弹出方式。这是理解-蒙昧主义——我敢肯定还有更糟糕的例子,但我的观点是理解并不总是更好
标签: python python-3.x dictionary-comprehension