So was
a, b, c = "hello 3.14 0".split()
b = float(b)
c = int(c)
Es ist ein Ärger, also möchte ich einen Weg finden, es auf einmal zu tun ... Vielleicht erfindet es jeder neu, oder?
@odashi_t auf Twitter
Der Vorgang, Zeilen mit Python zu lesen, sie durch Leerzeichen zu trennen und Werte für jede Variable immer zu lesen a,b,c,d,e,... = line.split() Danach habe ich jeden konvertiert, aber gibt es eine einfache Möglichkeit, ihn zu schreiben?
Ich brauche nichts so Anspruchsvolles wie einen regulären Ausdruck a,b,c,d,e = split_and_convert(line, (int, float, str, str, int)) Ich würde mich freuen, wenn ich so etwas wie> schreiben könnte.
Ich wollte auch Ihren intelligenten Weg kennen, also werde ich den veröffentlichen, den ich benutze
def map_apply(proc, args):
# return [f(x) for f, x in zip(proc, args)]
return map(lambda f,x:f(x), proc, args) # map(apply, proc, args) doesn't work like this
class FieldConverter:
def __init__(self, *args):
self._converters = args
def conv_proc(f):
def _wrap(conv_proc_to_num):
def proc(x):
try:
return conv_proc_to_num(x)
except ValueError:
return 0
return proc
if f is None:
return lambda s:s # identity
elif isinstance(f, str):
return lambda s:s.decode(f) # -> unicode
elif f in (int, float):
return _wrap(f)
else:
return f
if len(args) > 0:
self.converters = [conv_proc(f) for f in self._converters]
else:
self.converters = None
def convert(self, fields):
if self.converters:
return map_apply(self.converters, fields)
else:
return fields
def test_map_apply():
assert [0, -1, 3.14, 5.0] == map_apply([int,int,float,float], ['0','-1','3.14','5'])
assert [0,u'japanisch','japanisch'] == map_apply([int,lambda s:s.decode('utf-8'),lambda s:s], ['0','japanisch','japanisch'])
def test_field_converter():
assert [0, -1, 3.14, 5.0] == FieldConverter(int,int,float,float).convert(['0','-1','3.14','5'])
assert [0,u'japanisch','japanisch'] == FieldConverter(int,'utf-8',None).convert(['0','japanisch','japanisch'])
Ich brauche keine Erklärung für int und float. Wenn Sie so etwas wie 'utf-8' machen, wird es von UTF-8 dekodiert und in Unicode konvertiert. Keine ist keine Konvertierung Sie können jede Funktion mit einer Variablen (sogar Lambda) übergeben.
@ odashi_ts split_and_convert ()
def split_and_convert(line, types, delim=' '):
field_converter = FieldConverter(*types)
return field_converter.convert(line.split(delim))
def test_split_and_convert():
assert [0, -1, 3.14, 5.0] == split_and_convert('0\t-1\t3.14\t5', (int,int,float,float), '\t')
assert [0, u'japanisch', 'japanisch'] == split_and_convert('0,japanisch,japanisch', (int,'utf-8',None), ',')
Ich frage mich, ob es so implementiert werden kann. Ich möchte field_converter zwischenspeichern.
Wenn die Konvertierung nur int oder float ist
def split_and_convert(line, types, delim=' '):
return [f(x) for f,x in zip(types, line.split(delim))]
Es ist aber okay.
Wenn das so ist
a, b, c, d = split_and_convert('0\t-1\t3.14\t5', (int,int,float,float), '\t')
Kann wie verwendet werden. (A = 0, b = -1, t = 3,14, d = 5,0)
Vorerst werde ich den Code auf den Punkt bringen https://gist.github.com/naoyat/3db8cd96c8dcecb5caea
Recommended Posts