web-dev-qa-db-ja.com

[]と{}対list()とdict()、どちらが良いですか?

私はそれらが両方とも本質的に同じものであることを理解していますが、スタイルの面では、空のリストまたは辞書を作成するために使用する方が良い(よりPython的)ものですか?

94
Noah McIlraith

速度の面では、空のリスト/辞書の競合はありません。

>>> from timeit import timeit
>>> timeit("[]")
0.040084982867934334
>>> timeit("list()")
0.17704233359267718
>>> timeit("{}")
0.033620194745424214
>>> timeit("dict()")
0.1821558326547077

空でない場合:

>>> timeit("[1,2,3]")
0.24316302770330367
>>> timeit("list((1,2,3))")
0.44744206316727286
>>> timeit("list(foo)", setup="foo=(1,2,3)")
0.446036018543964
>>> timeit("{'a':1, 'b':2, 'c':3}")
0.20868602015059423
>>> timeit("dict(a=1, b=2, c=3)")
0.47635635255323905
>>> timeit("dict(bar)", setup="bar=[('a', 1), ('b', 2), ('c', 3)]")
0.9028228448029267

また、ブラケット表記を使用して、リストと辞書の内包表記を使用してみましょう。これは十分な理由かもしれません。

178
Greg Haskins

私の意見では、[]{}は、空のリスト/ dictを作成するための最もPythonicで読みやすい方法です。

ただし、set()には注意してください。例:

this_set = {5}
some_other_set = {}

混乱する可能性があります。最初は1つの要素を持つセットを作成し、2番目は空のdictを作成し、notセットを作成します。

31
orlp

[]と{}の方が優れています

list()は本質的に[]より遅く、dict()は本質的に{}より遅い

なぜなら、

  1. シンボル検索があります(pythonがリストを別のものに再定義していないかどうかを事前に知る方法はありません!)、

  2. 関数呼び出しがあり、

  3. 次に、渡された反復可能な引数があったかどうかを確認する必要があります(そのため、その要素からリストを作成できます)

ただし、ほとんどの場合、速度の違いは実用的な違いにはなりません。

ソース

27
Somnath Muluk

Dictリテラルは、バイトコードが短いほどtinyビット高速になる可能性があります。

In [1]: import dis
In [2]: a = lambda: {}
In [3]: b = lambda: dict()

In [4]: dis.dis(a)
  1           0 BUILD_MAP                0
              3 RETURN_VALUE

In [5]: dis.dis(b)
  1           0 LOAD_GLOBAL              0 (dict)
              3 CALL_FUNCTION            0
              6 RETURN_VALUE

list vs []についても同様です

14
ThiefMaster

私見、list()dict()を使用すると、PythonがCのように見えます。

3
RichieHindle

[]とlist()の違いの場合、他の誰も指摘していない落とし穴があります。リストのメンバーとして辞書を使用する場合、2つはまったく異なる結果になります。

In [1]: foo_dict = {"1":"foo", "2":"bar"}

In [2]: [foo_dict]
Out [2]: [{'1': 'foo', '2': 'bar'}]

In [3]: list(foo_dict)
Out [3]: ['1', '2'] 
1
oxtay

以下の例に示すように、[]とlist()の動作には1つの違いがあります。数値のリストを返したい場合はlist()を使用する必要があり、そうでない場合はマップオブジェクトを取得します!しかし、それを説明する方法がわかりません。

sth = [(1,2), (3,4),(5,6)]
sth2 = map(lambda x: x[1], sth) 
print(sth2) # print returns object <map object at 0x000001AB34C1D9B0>

sth2 = [map(lambda x: x[1], sth)]
print(sth2) # print returns object <map object at 0x000001AB34C1D9B0>
type(sth2) # list 
type(sth2[0]) # map

sth2 = list(map(lambda x: x[1], sth))
print(sth2) #[2, 4, 6]
type(sth2) # list
type(sth2[0]) # int
1
sebtac