2016-08-06 7 views
0

(好ましくはエレガントな)方法は最初の列に基づいて、2次元配列に対の配列を変換

[ 
    [150,200], 
    [], 
    [], 
    [350], 
    [800,750] 
] 
のように、このような

[[3,350],[4,800],[0,150],[0,200],[4,750]] 

としてペアの配列を取るためPythonであります

つまり、すべてのペアの2番目の数値を配列に入れて、その行インデックスをペアの最初の数値で指定するのは良い方法でしょうか?

+1

あなたが持っているリスト(インデックス1と2のようなもの)に空白がある場合は、デザインを再検討したいかもしれません。おそらく、辞書はここでは良い選択になるでしょう – thefourtheye

答えて

0

@thefourtheyeは、dictと書いてありますが、より良い容器かもしれません。あなたが2Dリストを必要とする場合には、最初に値を中間に追加することができます。dictここでkeyは行で、valueは数字のリストです。私はこの作業のためにpandasモジュールを使用することになり

>>> l = [[3,350],[4,800],[0,150],[0,200],[4,750]] 
>>> d = {} 
>>> for row, num in l: 
...  d.setdefault(row, []).append(num) 
... 
>>> [d.get(i, []) for i in range(max(d.keys()) + 1)] 
[[150, 200], [], [], [350], [800, 750]] 
0

In [186]: a = np.array([[3,350],[4,800],[0,150],[0,200],[4,750]]) 

In [187]: res = pd.DataFrame(a).groupby(0)[1].apply(list).to_frame('val').rename_axis('idx') 

In [188]: res 
Out[188]: 
      val 
idx 
0 [150, 200] 
3   [350] 
4 [800, 750] 

今、あなたは、インデックス付きのデータセットを持っていて、次のようにそれを使用することができ、あなたは、最終的な結果を生成するために、リストの内包表記を使用することができます方法:私はあなたが結果のデータセット内の空のリストを維持する必要はありませんだと思う

In [190]: res.ix[0, 'val'] 
Out[190]: [150, 200] 

In [191]: res.ix[0, 'val'][1] 
Out[191]: 200 

In [192]: res.ix[4, 'val'] 
Out[192]: [800, 750] 

PS - それは資源

の無駄だとして
1

リスト内包表記を見てみると、リストを作成するのに一線の方法があります。彼らが何であるかわからないなら、これはあなたが始めるためのかなりまともなガイドですhere。また、tupleを見てください。これは、リストとは対照的に、ペアになった値に適しているからです。タプルは変更可能ではないため、作成したタプルは変更できません。

あなたのリストに使用するタプルは、Pythonのリストではなく、彼らが成長し、変更が行われるよう縮小し、定義済みのサイズを持っていない、私の知る限り承知しているように、この

foo = [(3,350),(4,800),(0,200),(4,750)] 

ようになります。したがって、あなたがしたいことは、リスト内で最大のインデックス値を見つけることです。 は、メインリスト内のすべてのリストの最初のインデックスであるlist_of_pairsにアクセスします。この戦略は、tupleベースのリストでも機能することに注意してください。

以下、あなたがこれを行うにはnumeriousの方法があります

list_of_pairs = [[3,350],[4,800],[0,200],[4,750]] 
indexes = {x[0] for x in list_of_pairs} 
new_list = [] 

for i in indexes: 
    new_list.append([x[1] for x in list_of_pairs if x[0] == i]) 
0

やりたいはずです。

a = [[3, 350], [4, 800], [0, 150], [0, 200], [4, 750]] 

rows, values = zip(*a) 
b = [[] for _ in range(max(rows)+1)] # initialize 2D output 
for i, row in enumerate(rows): 
    b[row].append(values[i]) 

print(b) # -> [[150, 200], [], [], [350], [800, 750]] 
+0

[[誰かが私の質問に答えたときに何をすべきですか?_](http://stackoverflow.com/help/someone-answers) – martineau

関連する問題