0

while ループは次のとおりです。

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

コードを 1 行に収めようとしました。

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

しかし、実行すると、次のエラーが発生します。

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

どうすれば修正できますか?

ありがとう。

4

2 に答える 2

3

これは、次のようなものを書くことができるRubyのバックグラウンドから来ているようです

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

解決策:代わりにリスト内包表記を使用して、

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

これは、「新しいリストをください、foo 回」と言っています。

[[]] * 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]]

絶対に1行の while loopに設定されている場合、それを行う方法は次のようになります

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

しかし、リスト内包表記は最も単純で、最速で、最も Pythonic なソリューションです。

于 2013-09-20T16:26:43.453 に答える
2

私の知る限り、whileループを1行にすることはできません。しかし、内包表記を使用できます:

return [[] for x in range(foo)]
于 2013-09-20T16:23:07.747 に答える