Есть ли более Pythonic способ изменить `None` на` [] `, чем - PullRequest
3 голосов
/ 08 июля 2010

Есть ли более Pythonic способ сделать это?Иногда они None, потому что это значение по умолчанию.Это мой обходной путь, чтобы не делать [] значением по умолчанию.

Спасибо.

Ответы [ 5 ]

4 голосов
/ 08 июля 2010

Если вы предпочитаете это:

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

1 голос
/ 08 июля 2010

Если вы не можете исправить ввод, вы могли бы сделать это (становится «лучше», если вам нужно добавить больше):

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

Но замена этих значений на итерацию над пустым списком , который вы только что добавили, не имеет большого смысла (если, возможно, если вы добавляете что-то в этот список в какой-то момент). Поэтому, возможно, вы могли бы просто переместить тест на None -ness прямо перед итерацией:

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

Немного отошел от темы, но если вам когда-нибудь захочется проверить, является ли элемент итеративным, обычным (питоническим) способом было бы написать:

try:
    my_iterable_obj = iter(my_obj)
except TypeError:
    # not iterable
0 голосов
/ 13 декабря 2011

Если вы перебираете их, я предполагаю, что они хранятся в списке.В этом случае объединение некоторых из вышеуказанных подходов, вероятно, будет наилучшим.

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

Это краткий способ сделать это.Насколько мне известно, преобразования в map () выполняются быстрее, чем явные для циклов, поскольку циклы выполняются в основном коде C.

0 голосов
/ 08 июля 2010

Каждый из этих поисков атрибутов и диктов требует времени и обработки. Pythonic просто ищет self.name2info [name] только один раз, а затем работает с временным именем, связанным с этим 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", вы просто добавляете это в строку имен ключей.

0 голосов
/ 08 июля 2010

Вы можете сделать это так:

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']
...