【问题标题】:Delete empty set{} in Python在 Python 中删除空集{}
【发布时间】:2013-12-14 01:59:03
【问题描述】:

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.95 或x[j]>0.95, "var4":v4}] 更改变量以使其清晰

所以下一行代码将某些冗余的[i,j] 坐标减少为一个空集,这样coords = {}。我在删除带有coords = {} 的“集群”条目时遇到了麻烦,因此只有带有cluster 中的元素的“集群”元素存在(基本上通过坐标值过滤掉空的元素)。

我使用的是 python 2.7,所以 dict 列表对我不起作用。

【问题讨论】:

    标签: python list dictionary set


    【解决方案1】:

    这应该可行:

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

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

    注意:

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

    【讨论】:

      【解决方案2】:

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

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

      这应该清空所有具有空集值的键值对。

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

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

      【讨论】:

      • 在使用 .items() 迭代字典时修改字典是不安全的(取决于 python 版本)。在 python3 中使用list(dict.items())
      • 在 2 中,是的。在 3 中它是一个迭代器。目前尚不清楚提问者使用的是什么版本,所以值得一提的是它在 3 中是不安全的。
      • 我添加的注释准确吗?我不知道 Python 3 会为 items 提供不同的生成器实现。
      【解决方案3】:

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

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

      我建议使用list(dict.items())(假设 Python 3)。 dict.items()将键和值作为元组返回一个视图;当您从 dict 中删除项目时,即使您遍历其项目,此 视图 也会被修改。这可能会导致问题,因此将list 包裹起来将创建此返回的 view 的副本并防止这些问题。 (“视图”实际上是一个生成器,你可以阅读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 函数,因此请考虑使用另一个变量名称。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-04-25
        • 2018-02-21
        • 1970-01-01
        • 2018-12-20
        • 2013-10-10
        • 2010-12-26
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多