我列出了错误位置的项目列表。我想以定义的方式对它们重新排序并写入文件以供将来使用。
python 2.7.3
我有什么:
data_in = [..., [a1, a4, a0, a2, a3], ...] # where a0..a4 - some values
order_key = [2,0,3,4,1] # "2" means: in place with index 0 shall be item with index 2
结果应该是:
file.jsons:
prefix [ ... ] \n
prefix [a0, a1, a2, a3, a4] \n
prefix [ ... ] \n
我是以这种“天真”的方式做到的:
import json
from itertools import imap
formatter = "prefix {} \n".format
with open('file.jsons') as f:
f.writelines( imap(formatter, imap(json.dumps,([row[i] for i in order_key] for row in data_in ))))
# ([row[i] for i in order_key] for row in data_in ) - generator: yields arranged rows
# imap(json.dumps, ...) - generator: dumps lists into json strings
# imap(formatter, ... ) - generator: formats strings in proper way
# f.writelines( .. ) - consumes and writes to file
我有一些问题:
答案 0 :(得分:1)
你所拥有的实际上并不是我能看到的任何方式都是不合理的。从风格角度来看,为什么要专注于单线解决方案,有几个提高可读性的中间步骤会有所帮助。如果文件仅由您的程序使用,您还可以查看pickle
和shelve
模块。
答案 1 :(得分:1)
直升机,
我不是特别了解json。但是我的代码在我看来是精心制作的 如果 order_key = [2,0,3,4,1] 中的订单稳定,则认为使用补充功能可能会更快:
import json
from itertools import imap
# order_key = [2,0,3,4,1]
formatter = "prefix {} \n".format
def reorder(x):
return (x[2],x[0],x[3],x[4],x[1])
with open('file.jsons') as f:
f.writelines( imap(formatter,
imap(json.dumps,
(reorder[row) for row in data_in ))))
我在你的问题中没有看到任何批评,所以我支持downvote
order_key = [2,0,3,4,1]
exec('def reorder(x):\n return (%s)'
% ' , '.join( 'x[%d]' % i for i in (order_key)))
cn = (111,444 ,000,222,333)
cv = ['a1', 'a4', 'a0', 'a2', 'a3']
cx = ('one','four','zero','two','three')
print map(reorder,(cn,cv,cx))
结果
[(0, 111, 222, 333, 444), ('a0', 'a1', 'a2', 'a3', 'a4'),('zero', 'one', 'second', 'third', 'four')]