2

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

蟒蛇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() - 我知道这是一种非常糟糕的做法,但我确信自己是一个安全的数据提供者。
4

2 回答 2

1

在我看来,你在这里所拥有的东西实际上并不是不合理的。从风格的角度来看,提高可读性的几个中间步骤会有所帮助(为什么要关注单行解决方案?)。如果文件仅由您的程序使用,您还可以查看pickleand模块。shelve

于 2012-12-01T23:16:10.903 回答
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 ))))

我在您的问题中没有看到任何可批评的地方,所以我反对反对票

编辑

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')]
于 2012-12-01T23:48:28.270 回答