2017-02-09 3 views
0

私は次のように一覧l持っている:私は次のように新しい構造があるように、このリストを変換したい解明リスト

l = [([1, 0.0, 50.0, 2, 0.0, 50.0], [1, 1.9, 1]), 
    ([1, 0.0, 50.0, 2, 0.0, 50.0], [2, 1.9, 1])] 

すなわち
goal = [([1, 0.0, 50.0], [2, 0.0, 50.0], [1, 1.9, 1]), ([1, 0.0, 50.0], [2, 0.0, 50.0], [2, 1.9, 1])] 

を各タプルの最初のリストが長さ3のサブリストに分解されることを確認します。

私は以下の方法で試しましたが、さまざまな変換がnumpy配列を戻してしまいました。面倒だ。 さらに、この操作はlの大きな変形で起こる可能性があるため、パフォーマンスに優しい/インプレース(?)にする必要があります。

terms = np.array(l)[:,0] 
[np.split(np.array(i), 2) for i in terms] 

答えて

0

を私はnp.arrayの使用に反対して、

はオブジェクト配列です。しかし、配列バージョンは、それがタプルではなく、リストでなければならない場合リシェイプ

In [240]: [np.array(x[0]+x[1]).reshape(-1,3).tolist() for x in l] 
Out[240]: 
[[[1.0, 0.0, 50.0], [2.0, 0.0, 50.0], [1.0, 1.9, 1.0]], 
[[1.0, 0.0, 50.0], [2.0, 0.0, 50.0], [2.0, 1.9, 1.0]]] 

[tuple(n...を追加して、簡単にリストを分割することができます。

私はいくつかのトリックをしています。 2番目のアイテムの長さは希望するsplit(3)と同じであるため、最初は連結しているだけで、あとで行うことを心配しています。そして、配列の形状変更に続いてtolistが効果的に配列を分割します。

In [246]: np.reshape(x[0]+x[1],(-1,3)) 
Out[246]: 
array([[ 1. , 0. , 50. ], 
     [ 2. , 0. , 50. ], 
     [ 1. , 1.9, 1. ]]) 

これは、アレイの往復はおそらく同等itertoolsコードより遅い3

で均等にサブリストに分割することができることに依存します。


in-placeあなたはタプルのリストを持っているので、動作しません。これらのタプルを置き換えることはできますが、変更することはできません。彼らはリストだった場合は、このような分割にスプライス可能性:

In [248]: x 
Out[248]: ([1, 0.0, 50.0, 2, 0.0, 50.0], [1, 1.9, 1]) 
In [249]: xl=list(x) 

In [250]: xl[0:1] = [xl[0][:3],xl[0][3:]] # or the split of your choice 
In [251]: xl 
Out[251]: [[1, 0.0, 50.0], [2, 0.0, 50.0], [1, 1.9, 1]] 

は、多くの場合、場所で物事を変更するよりも、新しいリストやタプルを作成する方が便利です。リストのリストをコピーするとは、同じポインタの新しいリストを作成することを意味します。

[tuple([i[t:t+3] for i in sub for t in range(0, len(i), 3)]) for sub in l] 
:それは、リストの末尾をオフにスライスしても大丈夫なので


@Kasramvd'sisliceバージョンがに簡素化することができます

1

あなたはリスト内包内itertools.chainを使用することができます。

In [23]: from itertools import chain 

In [24]: [tuple(chain.from_iterable((i[:3], i[3:]) if len(i) > 3 else [i] for i in sub)) for sub in l] 
Out[24]: 
[([1, 0.0, 50.0], [2, 0.0, 50.0], [1, 1.9, 1]), 
([1, 0.0, 50.0], [2, 0.0, 50.0], [2, 1.9, 1])] 

あなたがトリプルにあなたのサブリストをスライスするためにitertools.isliceを使用することができ、一般的な方法としては:私の中

In [37]: [tuple(list(islice(i,t,t+3)) if len(i) > 3 else i for i in sub for t in range(0, len(i), 3)) for sub in l] 
Out[37]: 
[([1, 0.0, 50.0], [2, 0.0, 50.0], [1, 1.9, 1]), 
([1, 0.0, 50.0], [2, 0.0, 50.0], [2, 1.9, 1])]