栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

如何从一行文本创建字典?

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

如何从一行文本创建字典?

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


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/638091.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号