有没有更多的Pythonic方式将`None`改为`[]`而不是

时间:2010-07-07 20:38:39

标签: syntax coding-style python

有更多的Pythonic方式吗?:

            if self.name2info[name]['prereqs'] is None:
                self.name2info[name]['prereqs'] = []
            if self.name2info[name]['optionals'] is None:
                self.name2info[name]['optionals'] = []

我这样做的原因是因为我需要稍后重复这些。它们有时会None开始,因为这是默认值。我的解决方法是不将[]设为默认值。

感谢。

5 个答案:

答案 0 :(得分:4)

如果你喜欢这个:

self.name2info[name]['prereqs'] = self.name2info[name]['prereqs'] or []

答案 1 :(得分:1)

如果您无法修复输入,可以执行此操作(如果您需要添加更多内容,则变得“更好”):

for prop in ['prereqs', 'optionals']:
    if self.name2info[name][prop] is None:
        self.name2info[name][prop] = []

但是将这些值替换为迭代而不是你刚刚添加的空列表并没有多大意义(除非你附加一些东西)这个清单在某些时候)。所以也许你可以在迭代之前移动None - 的测试:

prereqs = self.name2info[name]['prereqs']
if prereqs is not None:
    for prereq in prereqs:
        do_stuff(prereq)

现在稍微偏离主题,但是如果你想测试一个项目是否可以迭代,那么常见的(pythonic)方式就是写:

try:
    my_iterable_obj = iter(my_obj)
except TypeError:
    # not iterable

答案 2 :(得分:0)

你可以这样做:

if not self.name2info[name]['prereqs']: self.name2info[name]['prereqs'] = []

或者这样

self.name2info[name]['prereqs'] = [] if not self.name2info[name]['prereqs'] else self.name2info[name]['prereqs']

答案 3 :(得分:0)

这些属性和字典查找中的每一个都需要时间和处理。只查看一次self.name2info [name]是Pythonic,然后使用绑定到该dict的临时名称:

rec = self.name2info[name]
for key in "prereqs optionals required elective distance".split():
    if key not in rec or rec[key] is None:
        rec[key] = []

现在,如果需要添加另一个类别,例如“AP_credit”,您只需将其添加到键名称字符串中。

答案 4 :(得分:0)

如果你在迭代它们,我认为它们存储在一个列表中。在这种情况下,结合上述一些方法可能是最好的。

seq=list(map(lambda x: x or [], seq))

这是一种简洁的方式。据我所知,map()中的转换比显式for循环更快,因为循环在底层C代码中运行。