在python中按给定顺序排列列表以转储到json中

时间:2012-12-01 22:36:48

标签: python json sorting

我列出了错误位置的项目列表。我想以定义的方式对它们重新排序并写入文件以供将来使用。

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

我有一些问题:

  • 这是重新安排的正确方法吗?转储?
  • 有更快的方法吗? (我需要尽快做到这一点)
  • 我应该使用json.dumps()/ json.reads()或str()/ eval() - 我知道它是一个非常 非常糟糕的做法,但我确信自己是一个安全的数据提供者。

2 个答案:

答案 0 :(得分:1)

你所拥有的实际上并不是我能看到的任何方式都是不合理的。从风格角度来看,为什么要专注于单线解决方案,有几个提高可读性的中间步骤会有所帮助。如果文件仅由您的程序使用,您还可以查看pickleshelve模块。

答案 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')]