我需要获取字典中的所有键,其中相应的值高于最小值并且在给定列表中。类似的东西:
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函数,但我不确定。有什么想法吗?
答案 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)]
明确比隐含更好 简单比复杂更好 可读性计算
答案 3 :(得分:1)
我认为您当前的解决方案运行正常。它是可读的,明确的和有效的(只有在没有限制时才测试allowed_keys
)。
如果您真的想使用单行,则应在没有限制时将allowed_keys
设置为完整的密钥集。
将allowed_keys
设置为None
意味着不允许使用密钥,这在语义上是违反直觉的。