Оговорка: это прямо вопрос для кода-игры в гольф, так что я знаю, что я спрашиваю, плохая практика в производствеИзменяя список с помощью добавления в течение списка понимания
Я пытаюсь изменить массив во время понимания списка, но по какой-то причине он висит, и я не знаю, почему и как это исправить.
Я имею дело со списком перечней неопределенной глубины и необходимости конденсировать их до плоского списка - for those curious its this question. Но на этом этапе давайте просто скажем, что мне нужен плоский список всех элементов в списке, и 0, если это список.
Нормальный метод перебора списка и, если его список добавить его до конца, так как:
for o in x:
if type(o)==type([]):x+=o
else:i+=o
print i
Я пытаюсь сократить этот список с помощью понимания, как так.
print sum([
[o,x.append(o) or 0][type(o)==type([])]
for o in x
]))
Теперь, я не знаю List.append
возвращает None, так чтобы гарантировать, что я получаю числовое значение, ленивые вычисления говорят, что я могу сделать x.append(o) or 0
, и так как None
является «falsy» будет evaulate второй части, а значение 0
.
Но это не так. Если я положил x.append()
в список по сравнению с x
, он не сломался или не ошибся, или не возвратит итерационную ошибку, он просто зависает. Почему append
Замораживание во время просмотра списка, но цикл for
выше работает нормально?
редактировать: Для того, чтобы сохранить этот вопрос от удаления, я не ищу гольф советы (они очень познавательно, хотя), я искал ответ, почему код не работает, как я написал это.
Не по теме для этого вопроса, но по оригинальной проблеме: не было бы проще сгладить вложенный итерабель в итератор (что вы можете сделать в 2-строчной функции в 3.3+, 3-строчной функции без, если вы не можете использовать сторонние модули, такие как 'more-itertools'), тогда просто напишите тривиальный код над этим итератором? – abarnert
@abarnert 'from itertools import *' имеет длину 22 символа, тогда вам нужно вызвать фактический метод. Это довольно высокая цена за библиотеку. –
'sum (map (lambda x: x% 2-.5, flatten (a)))' всего 37 символов. 22 + 1 + 37 = 60, что, безусловно, превосходит 73, что есть сейчас. – abarnert