2

我需要获取字典中的所有键,其对应值高于最小值并且在给定列表中。就像是:

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

但是,可能是我对允许的键没有限制。我发现最pythonic的做法是将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

4 回答 4

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)]

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

于 2012-04-28T00:48:35.763 回答
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)
于 2012-04-28T00:52:37.103 回答
2

除了为解决方案寻求“最 Pythonic”的语法之外,您还应该遵循良好的设计原则(例如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)]

来自Python 之禅

显式优于隐式。
简单胜于复杂。
可读性很重要

于 2012-04-28T01:11:45.607 回答
1

我认为您当前的解决方案效果很好。它可读、明确且高效(allowed_keys在没有限制的情况下只测试一次)。

如果你真的要使用单线,你应该allowed_keys在没有限制的情况下设置成全套键。设置allowed_keysNonekind of 意味着不允许使用任何键,这在语义上是违反直觉的..

于 2012-04-28T01:00:35.413 回答