In Python 2 Sie izip
im itertools
Modul und die Magie des Generators nutzen könnten Objekte eine eigene Funktion schreiben um die Erstellung von Wertepaaren für die dict
Datensätze zu vereinfachen. Ich habe die Idee für pairwise()
von einer ähnlichen Namen (aber funktionell verschieden) recipe in dem Python 2 itertools
docs.
Um den Ansatz in Python 3 verwenden Sie können einfach nur zip()
verwenden, da es das tut, was izip()
in Python hat 2 bei der Entfernung des letzteren aus itertools
— nachstehendem Beispiel dieser Adressen und soll in beiden Versionen arbeiten.
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)
Welche Dateien lesen for
Schleife wie dies in verwendet werden können:
mehr
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))
Aber warten Sie, ist da!
Es ist möglich, eine generalisierte Version erstellen Ich grouper()
nennen werde, die einen ähnlichen Namen entspricht wieder, aber funktionell verschiedene itertools
Rezept (die unter pairwise()
rechts aufgeführt wird):
def grouper(n, iterable):
"s -> (s0,s1,...sn-1), (sn,sn+1,...s2n-1), (s2n,s2n+1,...s3n-1), ..."
return izip(*[iter(iterable)]*n)
Welche sein könnte wie dies in Ihrer for
Schleife verwendet:
record = dict(grouper(2, fields))
natürlich, für bestimmte Fälle wie diesen, ist es einfach zu bedienen functools.partial()
und erstellen Sie eine ähnliche pairwise()
Funktion mit ihm (die sowohl in Python 2 & 3 funktioniert):
import functools
pairwise = functools.partial(grouper, 2)
Postscript
Es sei denn, es gibt eine wirklich große Anzahl von Feldern, könnten Sie stattdessen eine tatsächliche Sequenz erstellen aus den Paaren von Positionen (anstatt einen Generator Ausdruck verwendet, der keine len()
hat):
fields = tuple(field.strip() for field in line.split(','))
Sie könnten mit einem erhalten, indem einfacher grouper()
Funktion:
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)
Ich denke, das ist so pythisch wie es nur geht. –
Sind Sie nur an TSN-Aufzeichnungen interessiert? Oder beabsichtigen Sie, dies auf alle Datensatztypen auszudehnen? – marcog