gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 20:33:56 26 4
gpt4 key购买 nike

我有一个包含数千行的生成文件,如下所示:

CODE,XXX,DATE,20101201,TIME,070400,CONDITION_CODES,LTXT,PRICE,999.0000,QUANTITY,100,TSN,1510000001

有些行的字段较多,有些行的字段较少,但都遵循相同的键值对模式,并且每行都有一个 TSN 字段。

在对文件进行一些分析时,我写了一个类似下面的循环来将文件读入字典:

#!/usr/bin/env python

from sys import argv

records = {}
for line in open(argv[1]):
fields = line.strip().split(',')
record = dict(zip(fields[::2], fields[1::2]))
records[record['TSN']] = record

print 'Found %d records in the file.' % len(records)

...这很好并且完全符合我的要求(print 只是一个微不足道的例子)。

但是,它对我来说并没有特别“pythonic”的感觉,并且是:

dict(zip(fields[::2], fields[1::2]))

只是感觉“笨拙”(它在字段上迭代了多少次?)。

有没有更好的方法在 Python 2.6 中只用手头的标准模块来做到这一点?

最佳答案

在 Python 2 中,您可以使用 itertools 模块中的 izip 和生成器对象的魔力来编写您自己的函数,以简化为 dict 记录。 pairwise() 的想法来自一个类似名称(虽然功能不同)recipe在 Python 2 itertools 文档中。

要在 Python 3 中使用该方法,您只需使用普通的 zip(),因为它执行 izip() 在 Python 2 中执行的操作,从而导致后者从itertools — 下面的示例解决了这个问题并且应该在两个版本中都有效。

try:
from itertools import izip
except ImportError: # Python 3
izip = zip

def pairwise(iterable):
"s -> (s0,s1), (s2,s3), (s4, s5), ..."
a = iter(iterable)
return izip(a, a)

可以在你的文件读取 for 循环中像这样使用:

from sys import argv

records = {}
for line in open(argv[1]):
fields = (field.strip() for field in line.split(',')) # generator expr
record = dict(pairwise(fields))
records[record['TSN']] = record

print('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 functools
pairwise = functools.partial(grouper, 2)

后记

除非有大量字段,否则您可以从行项目对中创建一个实际序列(而不是使用没有 len()generator expression):

fields = tuple(field.strip() for field in line.split(','))

优点是它允许使用简单的切片来完成分组:

try:
xrange
except NameError: # Python 3
xrange = range

def grouper(n, sequence):
for i in xrange(0, len(sequence), n):
yield sequence[i:i+n]

pairwise = functools.partial(grouper, 2)

关于python - 如何从一行文本创建字典?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4356329/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com