2013-09-20 4 views
0

Здесь пока петля:список Construct в одну линию, а петля - SyntaxError: неверный синтаксис

def func1(foo) 
    bar = [] 
    while len(bar) < foo: 
     bar.append([]) 
    return bar 

Я пытался соответствовать свой код в одну строку:

def func1(foo) 
    bar = [] 
    return (bar.append([]) while len(bar) < foo) 

Но когда я запустите его, у меня есть следующая ошибка:

return (bar.append([]) while len(bar) < foo) 
         ^
SyntaxError: invalid syntax 

Как это исправить?

Спасибо.

+5

Что в мире вы думали, что было действительно синтаксисом Python? Вы не можете просто сделать sh * t и ожидать, что он будет работать! – kindall

+2

'Как я могу исправить это?' Просто не пытайтесь «подгонять мой код в одной строке» – Abhijit

+0

Это верно для 'if', а не' while' – karthikr

ответ

3

Это, кажется, приходит из фона Руби, где вы можете писать вещи, такие как

> i = 0 
> i += 1 while i < 10 
> i 
=> 10 

Решение: вместо этого использовать список понимание и

def func1(foo): 
    return [ [] for _ in range(foo) ] 

Что говорит «дайте мне новый список, foo times»

НЕ попытки использовать [[]] * foo стенографии, потому что все записи в списке будет на самом деле относятся к тому же подсписку

>>> l = [[]] * 10 
>>> l[0].append(2) # now every sublist has a 2 in it. 
>>> l 
[[2], [2], [2], [2], [2], [2], [2], [2], [2], [2]] 

или подобному использованию extend

>>> foo =6 
>>> bar = ['abc'] 
>>> bar.extend([[]] * foo) 
>>> bar 
['abc', [], [], [], [], [], []] 
>>> bar[1].append(2) # same problem 
>>> bar 
['abc', [2], [2], [2], [2], [2], [2]] 

Если у вас 'абсолютно установлен на однострочный цикл, способ сделать это будет

def func1(foo) 
    bar = [] 
    while len(bar) < foo: bar.append([]) 
    return bar 

Но список понимание является самым простым, быстрым, самым вещим решением

2

AFAIK у вас не может быть одной линии во время цикла. Но вы можете использовать comprehension:

return [[] for x in range(foo)] 
+0

foo - целое число, а не список –

+0

Хорошо, тогда не требуется 'len' (я этого не замечал). – TobiMarg

Смежные вопросы