[]和{} vs list()和 dict() ,哪个更好?

我知道它们本质上是相同的,但是就风格而言,哪一个更好(更 Python 化) ,用来创建一个空列表或者结果?

142668 次浏览

在我看来,[]{}是创建空列表/字典的最简洁和可读的方法。

不过,要对 set()保持警惕,例如:

this_set = {5}
some_other_set = {}

可能会让人困惑。第一个创建了一个包含一个元素的集合,第二个创建了一个空 dict 和一个 没有集合。

就速度而言,它没有空列表/词典的竞争:

>>> 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

此外,使用括号符号可以使用 list 和 dictionary 理解,这可能是足够的理由。

恕我直言,使用 list()dict()使您的 Python 看起来像 C。

由于字节码比较短,所以字节码可能比 很小快一点:

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

在[]和 list ()之间的区别的情况下,有一个我没有看到其他人指出的陷阱。 如果你使用一本字典作为列表的一部分,这两者会得到完全不同的结果:

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']

在[]和 list ()之间有一个不同的行为,如下面的例子所示。如果我们想要返回数字列表,我们需要使用 list () ,否则我们会得到一个 map 对象!不知道该怎么解释。

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

小心 list()[]的工作方式不同:

>>> def a(p):
...     print(id(p))
...
>>> for r in range(3):
...     a([])
...
139969725291904
139969725291904
139969725291904
>>> for r in range(3):
...     a(list())
...
139969725367296
139969725367552
139969725367616

list()总是在堆上创建一个新对象,但是 []可以在许多情况下重用内存单元。

方括号对表示列表对象或索引下标之一,如 my_List[x]

花括号对表示字典对象。

a_list = ['on', 'off', 1, 2]


a_dict = { on: 1, off: 2 }

List ()和[]之间没有这样的区别,但是如果将它与迭代器一起使用,它会给我们:

Nums = [1,2,3,4,5,6,7,8]

In: print ([ iter (nums)])

Out: [ < list _ iterator object at 0x03E4CDD8 > ]

输入: print (list (iter (nums)))

输出: [1,2,3,4,5,6,7,8]

list()[]之间的区别没有被任何人提到,是 list()将转换成一个列表,例如一个元组。[]会把这个元组放到一个列表中:

a_tuple = (1, 2, 3, 4)
test_list = list(a_tuple) # returns [1, 2, 3, 4]
test_brackets = [a_tuple] # returns [(1, 2, 3, 4)]

list()[]的另一个区别

list_1 = ["Hello World"] # is a list of the word "Hello World"
list_2 = list("Hello World") # is a list of letters 'H', 'e', 'l'...

要记住..。