2013-12-14 35 views
0

在python中隐式定义的函数令我困惑。在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} 

[先前字典= { “VAR1”:组([I,J]), “VAR2”:X [I] < 0.05或x [j]的< 0.05 ,“var3”:x [i]> 0.95或x [j]> 0.95,“var4”:v4}]改变变量以使其清楚

因此,下一行代码将某些冗余[i,j]坐标减少为空设置为coords = {}。我遇到问题,然后用coords = {}删除“集群”条目,这样只有cluster中存在元素的“集群”元素(基本上通过coords的值过滤空集合)。

我正在使用python 2.7,所以字典列表不适用于我。

回答

2

这应该工作:

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

这是一个简单的字典理解并筛选出的v空(falsy)值。

注:

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

好点。修正:) –

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,从而遍历一个正在被修改的对象。这是不安全和不可预测的。

+1

使用'.items()'(取决于python版本)迭代它时修改字典是不安全的。在python3中使用'list(dict.items())'。 – Tim

+1

2,是的。在3中它是一个迭代器。目前尚不清楚提问者使用的是什么版本,所以值得一提的是它在3中不安全。 – Tim

+0

我添加的提示是否准确?我不知道Python 3会有'item'的不同生成器实现。 – johannestaas

1

要确定是否某些变量x是空集,你可以这样做:

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

我建议使用list(dict.items())(假设的Python 3)。 dict.items()返回一个视图在键和值上作为元组;这个视图将在从dict删除项目时被修改,即使您在遍历其项目时也是如此。这可能会导致问题,所以围绕它包装list将创建此返回的副本并阻止这些问题。 (“查看”,实际上是发电机,你可以读到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函数,所以考虑使用另一个变量名称。

+0

@tom好点。我完全错了那部分。 – SimonT