我知道它们本质上是同一件事,但是就样式而言,哪个是创建空列表或字典的更好(更Pythonic的)?
我知道它们本质上是同一件事,但是就样式而言,哪个是创建空列表或字典的更好(更Pythonic的)?
Answers:
在速度方面,空列表/字典没有竞争:
>>> 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
另外,使用方括号表示法还可以使您使用列表和字典理解,这可能就足够了。
timeit()
函数报告执行指定数量的迭代的总时间1000000
,默认情况下是这样。因此,上面的示例是运行一百万次代码段的秒数。例如timeit('dict()', number=1) // -> 4.0531158447265625e-06
(一次迭代)而timeit('dict()') // -> 0.12412905693054199
(一百万次迭代)
我认为[]
并且{}
是创建空列表/字典的最Python易懂的方法。
不过请注意set()
,例如:
this_set = {5}
some_other_set = {}
可能会造成混乱。第一个创建一个带有一个元素的集合,第二个创建一个空字典而不是一个集合。
{}
总是创建一个空的字典。{1,2,3}
在2.7+ 2.6
版本中创建了一个集合,但在旧版本中是语法错误。
some_epic_set
指向一个空dict
对象……这不是一个空集。对于空集,您需要使用set()
。
{5}
创建了一个包含一个元素的集合,5
并且{}
是空洞的字典。
该字典的文字可能是一个小小的其字节码更短更快一点:
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[]
CALL_FUNCTION
是,至少要花费与BUILD_MAP
(本质上称为的函数是BUILD_MAP
)一样多的时间,而LOAD_GLOBAL
这仅仅是额外的开销。
对于[]和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']
[foo_dict]
使用可获得相同的结果list((foo_dict,))
。该list()
方法采用一个iterable作为唯一参数,并对其进行迭代以将元素添加到列表中。这样做会导致类似的陷阱,list(some_list)
从而使列表变平。
如下所示,[]和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
方括号对表示列表对象或索引下标my_List [x]中的一个。
大括号对表示字典对象。
a_list = ['on','off',1,2]
a_dict = {开启:1,关闭:2}
大多数时候,这主要是选择问题。这是一个偏好问题。
但是请注意,例如,如果您有数字键,则不能这样做:
mydict = dict(1="foo", 2="bar")
你所要做的:
mydict = {"1":"foo", "2":"bar"}
mydict = {1:"foo", 2:"bar"}
(不带引号)。
list(i for i in range(10) if i % 2)