在Python
2中,您可以
izip在
itertools模块和生成器对象中使用魔术来编写自己的函数,以简化
dict记录值对的创建。我
pairwise()从Python
2文档中一个类似命名(但功能不同)的食谱中得到了这个想法
itertools。
要在Python 3中使用该方法,您可以使用plain,
zip()因为它的作用与
izip()在Python 2中的作用相同,导致将后者从python
2中删除
itertools了。
try: from itertools import izipexcept importError: # Python 3 izip = zipdef pairwise(iterable): "s -> (s0,s1), (s2,s3), (s4, s5), ..." a = iter(iterable) return izip(a, a)
在文件读取
for循环中可以这样使用:
from sys import argvrecords = {}for line in open(argv[1]): fields = (field.strip() for field in line.split(',')) # generator expr record = dict(pairwise(fields)) records[record['TSN']] = recordprint('Found %d records in the file.' % len(records))但是,等等,还有更多!
可以创建一个通用的版本,我将其称为
grouper(),再次对应于一个名称相似但功能不同的
itertools配方(在下面列出
pairwise()):
def grouper(n, iterable): "s -> (s0,s1,...sn-1), (sn,sn+1,...s2n-1), (s2n,s2n+1,...s3n-1), ..." return izip(*[iter(iterable)]*n)
在
for循环中可以这样使用:
record = dict(grouper(2, fields))
当然,对于像这样的特定情况,很容易使用它
functools.partial()并创建类似的
pairwise()函数(将在Python
2和3中都可以使用):
import functoolspairwise = functools.partial(grouper, 2)
后记
除非字段的数量非常多,否则您可以改为从订单项对中创建实际的序列(而不是使用没有的生成器表达式
len()):
fields = tuple(field.strip() for field in line.split(','))好处是,它将允许使用简单的切片来完成分组:
try: xrangeexcept NameError: # Python 3 xrange = rangedef grouper(n, sequence): for i in xrange(0, len(sequence), n): yield sequence[i:i+n]pairwise = functools.partial(grouper, 2)



