2013-12-14 71 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