如何压缩这个?

时间:2015-11-16 15:00:39

标签: python dictionary

我有一本字典词典。我想算一下这些词典中有多少具有元素和#34;状态"设置为"连接"。

这是我的工作代码:

connecting = 0
for x in self.servers:
    if self.servers[x]["status"] == "connecting": connecting += 1

有没有办法压缩这个?我想的是:

connecting = [1 if self.servers[x]["status"] == "closed" else 0 for x in self.servers]

但它只返回0和1的列表,不会将1添加到连接中,这正是我所期望的。

4 个答案:

答案 0 :(得分:7)

您可以在sum函数中使用生成器表达式:

sum(x["status"]=="connecting" for x in self.servers.values()) 

请注意,由于x["status"]=="connecting"的结果是一个布尔值,如果它是True,python会将其评估为1,所以最后它将返回符合条件的字典数。

答案 1 :(得分:2)

您可以使用sum。您已经具有列表推导,因此只需将其包装在sum

connecting = sum(1 for x in self.servers if self.servers[x]["status"] == "closed")

答案 2 :(得分:1)

如果您想要计算所有状态类型:

import collections

statuscounts = collections.Counter(server['status'] for server in self.servers.values())

connecting = statuscounts['connecting']

答案 3 :(得分:0)

我愿意

connecting = len([1 for i in self.servers if self.servers[i]["status"] == "connecting"])

我使用len,因为它具有复杂度O(1)vs sum,其复杂度为O(n)因为汇总只有1的列表与得到它的长度相同< / p>