В Python 2 вы можете использовать izip
в модуле itertools
и магию объектов-генераторов, чтобы написать собственную функцию для упрощения создания пар значений для записей dict
. Я получил идею для pairwise()
из одноименного (но функционально другого) рецепта в Python 2 itertools
docs.
Чтобы использовать подход в Python 3, вы можете просто использовать обычный zip()
, поскольку он делает то, что izip()
делал в Python 2, что приводит к удалению последнего из itertools
& mdash; приведенный ниже пример решает эту проблему и должен работать в обеих версиях.
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
loop:
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()
):
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)