2017-10-20 10 views
2

と2Dリストインデックス作成listなど:は別のリスト

lst = [[1,2,3], [4,5,6], [7,8,9]] 

と含む別listlistにおける要素の[row, column]index、例えばので:

index = [2, 1] 

私は明らかにelementindexで得ることができます:

lst[index[0]][index[1]] 

しかし、私はこのsyntaxが非常にclunkyであり、大きなコードブロックにうまく座っていないことがわかりました。また、より高い次元のlistで悪化する。

私の質問:これは簡単な方法ですindex

lst[index] 

読みやすくなりますが、これはPythonはそれほどオプションではありませんどのように動作するかではありません:。

のようなものがあることと思われます

+0

はあなたが行うことができます 'I、J = index'その後、' LST [I] [J] ' –

答えて

2

です。次に、index as a tupleを定義するだけです。

>>> import numpy as np 
>>> a = np.array([[1,2,3], [4,5,6], [7,8,9]]) 
>>> index = (1, 2) 
>>> a[index] 
6 

あなたはRubyでArray#digと呼ばれている探している方法:インデックス3は、しかし、範囲外となり

[[1,2,3], [4,5,6], [7,8,9]].dig(1, 2) 
# 6 

が、私は、任意のプレーンPythonの同等のものを見つけることができませんでした。

1

あなたが使用した方法は、おそらく最も簡単な方法ですが、読みやすくするため、あなたが

i = index[0] 
j = index[1] 
x = lst[i][j] 

一つの方法または別のようなもののために行くことができ、あなたは、2つの値にあなたのインデックスリストを分割する必要があります。メインブロックのコードを宣言したい場合は、これを処理する関数を書くことができますが、それはほとんど「簡単」にはなりません。

EDIT:以下示唆したように、タプルアンパックあなたは、2D-リストで作業しているので、numpyを使用するためには良い考えかもしれませんでも良いオプション

i, j = index 
x = lst[i][j] 
+2

または、タプルのアンパックを使用して、' i、j = index'/'x = lst [i] [j]'。 –

2

インデックスを反復処理する単純な関数を作成することができます。インデックス内のすべての要素に対して、オブジェクトから項目を取り出して、それを新しいオブジェクトとして割り当てます。インデックス全体を反復処理すると、現在のオブジェクトが返されます。

def index(obj, idx): 
    for i in idx: 
     obj = obj[i] 

    return obj 

LST = [[1,2,3], [4,[5],6], [{'foo': {'bar': 'foobar'}},8,9]] 
INDEXES = [[2, 2], [1, 1, 0], [2, 0, 'foo', 'bar']] 

for i in INDEXES: 
    print('{0} -> {1}'.format(i, index(LST, i))) 

出力:@EricDuminilは、それがdictsと__getitem__をサポートする他のすべてのオブジェクトと連携述べたように

[2, 2] -> 9 
[1, 1, 0] -> 5 
[2, 0, 'foo', 'bar'] -> foobar 
+0

+1素敵なきちんとした機能 - 特に「n」ディメンションのために働くことができます。しかし、私はnumpyの解決策が私の意見では丁寧であることを発見しました! –

+1

ニース。ボーナスとして、それはdictsで(あなたが慎重であれば)動作します。 '' [1,2,3]、[4、[5]、6]、[7,8,9、{'a': 'b'}]] 'と' 'a'])) '。 –

関連する問題