列表理解期间的Python字典分配
我有一个权限字典,例如:列表理解期间的Python字典分配,python,list-comprehension,Python,List Comprehension,我有一个权限字典,例如: {'READ': True, 'WRITE': None, 'DELETE': False} 实际的字典有更多的键,但这就足够了。我想遍历字典,并将None的任何值更改为False。使用for循环可以很容易地做到这一点,但我想知道是否有一种惯用的方法可以通过列表理解来做到这一点。如果它是一个对象而不是一本字典,我会: [setattr(k, v, False) for k, v in object if v is None] (或类似),但我不知道如果不使用dic
{'READ': True, 'WRITE': None, 'DELETE': False}
实际的字典有更多的键,但这就足够了。我想遍历字典,并将None
的任何值更改为False
。使用for循环可以很容易地做到这一点,但我想知道是否有一种惯用的方法可以通过列表理解来做到这一点。如果它是一个对象而不是一本字典,我会:
[setattr(k, v, False) for k, v in object if v is None]
(或类似),但我不知道如果不使用dict.\uuuuuuu setitem\uuuuuu
这对于解决我的问题来说并不是非常重要,但我只是想知道是否有更简洁的方法来解决这个问题您是否考虑过:
注意:如果您使用的是Python2.x,那么应该使用而不是dict.items
。这样做将提高效率,因为前者返回迭代器,后者返回列表。您是否考虑过:
注意:如果您使用的是Python2.x,那么应该使用而不是
dict.items
。这样做将提高效率,因为前者返回一个迭代器,后者返回一个列表。不要对副作用使用列表理解;在此处生成None
值列表没有意义
相反,使用听写理解:
{k: False if v is None else v for k, v in object.iteritems()}
不要使用列表理解副作用;在此处生成
None
值列表没有意义
相反,使用听写理解:
{k: False if v is None else v for k, v in object.iteritems()}
为什么不直接使用循环而不是创建一个新的dict呢?@KDawG我理解,但它看起来像是在不必要的时候尝试“惯用”。@arshajii:既然你必须测试所有的键,dict理解就是惯用的。是的,我认为惯用是错误的词。我想说的是:尽管修改dict(即使用一个简单的循环)不是更好吗?这取决于这里替换了多少值,以及目标是什么。性能还是可读性?因为您使用的是高级Python语法(是的,这显然是使用dict理解的原因)。我同意一个简单的循环可能会表现得更好。为什么不直接使用循环而不是创建一个新的dict呢?@KDawG我理解,但它看起来像是在不必要的时候尝试“惯用”。@arshajii:既然你必须测试所有的键,那么dict理解就是惯用的。是的,我认为惯用是错误的词。我想说的是:尽管修改dict(即使用一个简单的循环)不是更好吗?这取决于这里替换了多少值,以及目标是什么。性能还是可读性?因为您使用的是高级Python语法(是的,这显然是使用dict理解的原因)。我同意简单的循环可能会执行得更好。