在Python中删除空集{}

时间:2013-12-14 01:59:03

标签: python list dictionary set

python中隐式定义的函数让我感到困惑。

我有一个词典

cluster={"coords":set([i,j]), "var2":x[i]<0.05 or x[j]<0.05, "var3":x[i]>0.95 or x[j]>0.95, "var4":v4}

[先前dict = {“var1”:set([i,j]),“var2”:x [i] <0.05或x [j] <0.05,“var3”:x [i]&gt; ; 0.95或x [j]> 0.95,“var4”:v4}]更改变量以使其清晰

因此,下一行代码会将某些冗余[i,j]坐标减少为空集,以便coords = {}。我在使用coords = {}删除“群集”条目时遇到问题,因此只有cluster中包含元素的“群集”元素存在(基本上用coords的值过滤掉空的元素)。

我正在使用python 2.7,因此dict列表对我不起作用。

3 个答案:

答案 0 :(得分:2)

这应该有效:

dd = dict((k, v) for k, v in d.items() if v != set())

这是一个简单的字典理解,并过滤掉v的空( falsy )值。

注意:

  • 不要将变量dict命名为内置dict类型。
  • 这会创建一个新的dict,而不是修改现有的dict实例。

答案 1 :(得分:2)

如果我理解你的问题,你想要删除字典中值为空集的项目。

for k,v in dict.items():
    if v == set():
        del dict[k]

这应该清空所有键值对,其值为空集。

如评论中所述,dict.items()仅在Python 2.x中是安全的。在3.x中,您可以使用list(dict.items())

原因是,在迭代它时修改字典是不安全的。 items将返回Python 2.x中的元组列表,在迭代它时它将保持静态。 Python 3.x中的items将在每次迭代中继续检查dict,从而迭代一个被修改的对象。这是不安全和不可预测的。

答案 2 :(得分:1)

要确定某个变量x是否为空集,您可以使用:

if isinstance(x, set) and len(x) == 0:
    ...

我建议使用list(dict.items())(假设是Python 3)。 dict.items()在键和值上返回视图作为元组;当您在dict中删除项目时,即使您遍历其项目,也会修改此视图。这可能会导致问题,因此在其周围包装list将创建此返回的视图的副本并防止出现这些问题。 (A&#34;视图&#34;实际上是生成器,您可以阅读here

for (key, value) in theDict.items():
    if isinstance(value, set) and len(value) == 0: # note len(value) only computed if value is a set, so no worries about calling len on something that has no __len__ defined.
        del theDict[key]

关于约定的注释:名称dict已用于该名称的内置Python函数,因此请考虑使用另一个变量名。