使用元数据字典编写固定宽度字符串是否有更多Pythonic方法,而不是创建for循环/嵌套for循环?
我的意见如下:
{
't_order': 11112014,
't_date': 20150101,
't_external': 'from sample',
't_mode': 'A',
'message_id': 'ID01',
't_value': 123.45
}
我的meta-dict看起来像这样:
[{'field': 'message_id',
'decimalPrecision': '0',
'isTypeOf': 'C',
'Length': '8',
'Level': '0',
'Start': '1'},
{'field': 't_mode',
'decimalPrecision': '0',
'isTypeOf': 'C',
'Length': '1',
'Level': '0',
'Start': '9'},
{'field': 't_order',
'decimalPrecision': '0',
'isTypeOf': '9',
'Length': '8',
'Level': '0',
'Start': '10'},
{'field': 't_external',
'decimalPrecision': '0',
'isTypeOf': 'C',
'Length': '25',
'Level': '0',
'Start': '18'},
{'field': 't_date',
'decimalPrecision': '0',
'isTypeOf': '9',
'Length': '8',
'Level': '0',
'Start': '43'},
{'field': 't_value',
'decimalPrecision': '4',
'isTypeOf': '9',
'Length': '18',
'Level': '0',
'Start': '51'}]
isTypeOf == C
的任何内容都是str
而isTypeOf == 9
是int
。
Start
值是字符串位置的开头,Length
是左边空格填充字段的长度。数字字段不包含小数点,并且在精度中右对齐。话虽这么说,给定的样本将是:
ID01 A11112014from sample 20150101 1234500
什么是更有效的方式而不是循环/嵌套的for-statements?
答案 0 :(得分:1)
我 想象有更好的方法来做到这一点,但这似乎有效:
def extract_elem(input_dict, meta_elem):
val = input_dict[meta_elem['field']]
off = int(meta_elem['Start'])
flen = int(meta_elem['Length'])
if meta_elem['isTypeOf'] == 'C': # String
return off, val.ljust(flen, ' ')
if meta_elem['isTypeOf'] == '9': # Float / Int
prec = int(meta_elem['decimalPrecision'])
fmt = "%%.%df" % prec
val = (fmt % val).replace('.','')
return off, val.rjust(flen, ' ')
def extract(input_dict, meta_list):
s = ['' * 200]
for m in meta_list:
off, val = extract_elem(_input_dict, m)
end = off + len(val)
s[off:end] = val
return ''.join(s)
print extract(_input_dict, _meta_list)
输出:
ID01 A11112014from sample 20150101 1234500
答案 1 :(得分:0)
我强烈建议for循环将是最pythonic的方式来做到这一点。 Python倾向于简洁的可读性
复杂比复杂
更好也就是说,如果您的元数据是以字符串作为字典名称的字典,您可以索引字典并避免嵌套循环。
真正的pythonic要做的是确保原始记录是由生成器生成的,而不是加载到列表中。