检查列表中可能为None的成员身份的pythonic方法是什么?

时间:2012-04-28 00:45:52

标签: python

我需要获取字典中的所有键,其中相应的值高于最小值并且在给定列表中。类似的东西:

result = [k for k in my_dict if my_dict[k] > min_value and k in allowed_keys]

但是,我可能会对允许的密钥没有限制。我发现最狡猾的做法是将allowed_keys设置为None。但这会让我看到丑陋的代码:

if allowed_keys is None:
    result = [k for k in my_dict if my_dict[k] > min_value]
else:
    result = [k for k in my_dict if my_dict[k] > min_value and k in allowed_keys]

我觉得必须有一个更明智和pythonic的解决方案。我想过使用lambda函数,但我不确定。有什么想法吗?

4 个答案:

答案 0 :(得分:4)

您可以在列表解析中查看allowed_keys is None

result = [k for k in my_dict if my_dict[k] > min_value and (allowed_keys is None or k in allowed_keys)]

这看起来像一个非常奇怪的英语句子。

答案 1 :(得分:4)

当您需要同时访问键和值时使用iteritems()

result = [k for k, v in my_dict.iteritems()
          if v > min_value
          and (k in allowed_keys if allowed_keys is not None else True)]

# shorter but seems harder to read
result = [k for k, v in my_dict.iteritems()
          if v > min_value
          and (True if allowed_keys is None else k in allowed_keys)]

# shorter but a bit weird and slower
result = [k for k, v in my_dict.iteritems()
          if v > min_value
          and (k in (allowed_keys or my_dict))]

# senderie's comment, very clear in logic, no more no less. I'd like to pick it.
result = [k for k, v in my_dict.iteritems()
          if v > min_value
          and (allowed_keys is None or k in allowed_keys)

答案 2 :(得分:2)

除了寻求解决方案的“最pythonic”语法之外,您还应遵循良好的设计原则(例如The Zen of Python)。

通过引入allow_all_keys布尔属性而不是重载allowed_keys的含义,您的代码会更加清晰。这样做,代码变为:

result = [k for k in my_dict if my_dict[k] > min_value and 
                                (allow_all_keys or k in allowed_keys)]

来自The Zen of Python

  

明确比隐含更好   简单比复杂更好   可读性计算

答案 3 :(得分:1)

我认为您当前的解决方案运行正常。它是可读的,明确的和有效的(只有在没有限制时才测试allowed_keys)。

如果您真的想使用单行,则应在没有限制时将allowed_keys设置为完整的密钥集。 将allowed_keys设置为None意味着不允许使用密钥,这在语义上是违反直觉的。