2

アイテムが間違った位置にあるリストのリストがあります。そして、定義された方法でそれらを並べ替えて、将来の使用のためにファイルに書き込みたいと思います。

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()を使用しますか?これは非常に悪い習慣であることは知っていますが、安全なデータプロバイダーであると確信しています。
4

2 に答える 2

1

あなたがここに持っているものは、私が見ることができる方法で実際に不合理ではありません。読みやすさを向上させるためのいくつかの中間ステップは、文体の観点から役立ちます(なぜ単一行ソリューションに焦点を合わせるのですか?)。pickleファイルがプログラムでのみ使用されている場合は、および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 に答える