继续一起学习Python的实用技巧
一、创建String: 从列表中创建开始定义一个 string 列表:
Python代码
colors = ['red', 'blue', 'green', 'yellow']
当我们需要将上面的列表连接成一个字符串。尤其当 list 是一个很大的列表时…
不要这样做:
Python代码
result = ''
for s in colors:
result += s
这种方式效率非常低下的,它有可怕的内存使用问题,至于为什么,如果你是 javaer 的话,其中的 string 连接,我想你并不陌生。
相反,你应该这样做:
Python代码
result = ''.join(colors)
当你只有几十或几百个string项连接时,它们效率上并不会太大的差别。但你要在养成写高效代码的习惯,因为当字符串数千时,join 比起 for 连接性能会能有所提升。
如果你需要使用一个函数来生成一个字符串列表,同样可以使用:
Python代码
result = ''.join(fn(i) for i in items)
尽可能的使用
Good:
Python代码
for key in d:
print key
◆ 使用 in 一般情况下是非常快的。
◆ 这种方式也适用于其它的容器对象(如 list,tuple 和 set)。
◆ in 是操作符(正如上面所看到的)。
Bad:
Python代码
for key in d.keys():
print key
保持与上面的一致性,使用 use key in dict 方式,而不是 dict.has_key():
Python代码
# do this:
if key in d:
...do something with d[key]
# not this:
if d.has_key(key):
...do something with d[key]
二、字典中的 get 函数我们经常需要在字典中初始化数据:
以下是不好的实现方法:
Python代码
navs = {}
for (portfolio, equity, position) in data:
if portfolio not in navs:
navs[portfolio] = 0
navs[portfolio] += position * prices[equity]
使用dict.get(key, default) 删除 if 判断代码:
Python代码
navs = {}
for (portfolio, equity, position) in data:
navs[portfolio] = (navs.get(portfolio, 0)
+ position * prices[equity])
三、字典中的 setdefault 函数 (1)
当我们要初始化一个可变字典的值。每个字典的值将是一个列表。下面是不好的做法:
初始化可变字典的值:
Python代码
equities = {}
for (portfolio, equity) in data:
if portfolio in equities:
equities[portfolio].append(equity)
else:
equities[portfolio] = [equity]
通过 dict.setdefault(key, default) 使这段代码工作的更好:
Python代码
equities = {}
for (portfolio, equity) in data:
equities.setdefault(portfolio, []).append(
equity)
dict.setdefault()等同于“ get, or set & get“ 或"如果没有,就设置"; 如果你的字典Key是复杂的计算或long类型,使用 setdefault 是特别有效的。
四、字典中的 setdefault 函数 (2)
在我们看到的setdefault字典方法也可以作为一个独立的语句使用:
Python代码
avs = {}
for (portfolio, equity, position) in data:
navs.setdefault(portfolio, 0)
navs[portfolio] += position * prices[equity]
我们在这里忽略了字典的setdefault方法返回的默认值。我们正利用的setdefault中的作用,仅仅只是在dict中没有 key 的值的时候才会设置
五、创建 & 分割字典
如果你有两份 list 对象,希望通过这两个对象构建一个 dict 对象。
Python代码
given = ['John', 'Eric', 'Terry', 'Michael']
family = ['Cleese', 'Idle', 'Gilliam', 'Palin']
pythons = dict(zip(given, family))
>>> pprint.pprint(pythons)
{'John': 'Cleese',
'Michael': 'Palin',
'Eric': 'Idle',
'Terry': 'Gilliam'}
同样,如果希望获取两份列表,也是非常简单:
Python代码
>>> pythons.keys()
['John', 'Michael', 'Eric', 'Terry']
>>> pythons.values()
['Cleese', 'Palin', 'Idle', 'Gilliam']
需要注意的是,上面 list 虽然是有序的,但是 dict 中的 keys 和 values 是无序的,这正是因为 dict 本质就是无序存储的。