回答:
次のように書くこともできます:
[e] * n
eがたとえば空のリストである場合、n個の独立した空のリストではなく、同じリストへのn個の参照を持つリストを取得することに注意してください。
性能試験
一見すると、n個の同一の要素を持つリストを作成するには、繰り返しが最も速い方法のようです。
>>> timeit.timeit('itertools.repeat(0, 10)', 'import itertools', number = 1000000)
0.37095273281943264
>>> timeit.timeit('[0] * 10', 'import itertools', number = 1000000)
0.5577236771712819
しかし、待ってください-それは公正なテストではありません...
>>> itertools.repeat(0, 10)
repeat(0, 10) # Not a list!!!
この関数itertools.repeat
は実際にリストを作成するのではなく、必要に応じてリストを作成するために使用できるオブジェクトを作成するだけです。もう一度試してみましょう。ただし、リストに変換します。
>>> timeit.timeit('list(itertools.repeat(0, 10))', 'import itertools', number = 1000000)
1.7508119747063233
したがって、リストが必要な場合は、を使用してください[e] * n
。要素を遅延生成する場合は、を使用しますrepeat
。
[[]] * n
場合、予期しない結果が生じる可能性があります。作成するにはユニークな空のサブリストを、するために、理解使用:[[] for i in range(0,n)]
Pythonでn回繰り返された単一アイテムのリストを作成する
None、bools、ints、floats、strings、tuples、frozensetsなどの不変アイテムの場合、次のように実行できます。
[e] * 4
これらはすべてメモリ内の同じ場所にある同じ項目を指すため、リスト内の不変の項目(文字列、タプル、frozensetsなど)でのみ使用するのが最適であることに注意してください。すべての文字列のスキーマを含むテーブルを作成する必要がある場合、これを頻繁に使用するため、非常に冗長な1対1のマッピングを指定する必要がありません。
schema = ['string'] * len(columns)
私は長い間Pythonを使用してきましたが、可変インスタンスで上記を行うユースケースを見たことがありません。代わりに、たとえば、変更可能な空のリスト、セット、または辞書を取得するには、次のようにする必要があります。
list_of_lists = [[] for _ in columns]
下線は、このコンテキストでは単に使い捨ての変数名です。
数しかわからない場合は、次のようになります。
list_of_lists = [[] for _ in range(4)]
これ_
は特別なことではありませんが、変数を使用するつもりがなく、他の名前を使用するつもりがない場合、コーディング環境のスタイルチェッカーはおそらく文句を言うでしょう。
可変オブジェクトでこれを行うことに注意してください。それらの1つを変更すると、それらはすべて同じオブジェクトであるため、すべて変更されます。
foo = [[]] * 4
foo[0].append('x')
fooは次を返します:
[['x'], ['x'], ['x'], ['x']]
しかし、不変オブジェクトでは、オブジェクトではなく参照を変更するため、それを機能させることができます。
>>> l = [0] * 4
>>> l[0] += 1
>>> l
[1, 0, 0, 0]
>>> l = [frozenset()] * 4
>>> l[0] |= set('abc')
>>> l
[frozenset(['a', 'c', 'b']), frozenset([]), frozenset([]), frozenset([])]
しかし、繰り返しになりますが、インプレース操作は参照ではなくオブジェクトを変更するため、可変オブジェクトはこれには適していません。
l = [set()] * 4
>>> l[0] |= set('abc')
>>> l
[set(['a', 'c', 'b']), set(['a', 'c', 'b']), set(['a', 'c', 'b']), set(['a', 'c', 'b'])]
Itertoolsにはそのための機能があります。
import itertools
it = itertools.repeat(e,n)
もちろんitertools
、リストの代わりにイテレータを提供します。[e] * n
リストが表示されますが、これらのシーケンスで何を行うかによっては、itertools
バリアントの方がはるかに効率的です。
[e] * n
うまくいくはず