2017-10-20 126 views
2

如果我有一個list如:索引一個2D列表與另一個列表

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

和另一list含有[row, column]indexlist的元件,因此,例如:

index = [2, 1] 

很明顯,我可以通過elementindex與:

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

不過,我覺得這syntax是相當笨重,在代碼中的大塊不坐好。如果尺寸較大,list也會變差。

我的問題:有更簡單的方式做到這一點index

這似乎是這樣的:

lst[index] 

會更可讀,但是這不是Python的如何工作的,是不是一種選擇。

+0

你可以做'I,J = index'然後'LST [i] [j] ' –

回答

2

既然你用二維表的工作,它可能是使用numpy一個好主意。那麼你只需要定義index as a tuple。指數3會超出範圍,但:

>>> 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的方法:

[[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倍的值。如果你想簡化房間你的代碼主要塊,你可以寫一個函數來處理這個問題,但決不會是「容易」。

編輯:由於以下建議,元組拆包是一個更好的選擇

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

或者,使用元組拆包,'I,J = index' /'X = LST [i] [j]'。 –

2

你可以只創建一個簡單的函數,在指數迭代。對於索引中的每個元素,只需從對象中獲取項目並將其分配爲新對象。一旦你迭代了整個索引返回當前對象。作爲@EricDuminil指出它與類型的字典,並支持__getitem__所有其他對象:

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))) 

輸出:

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

+1尼斯整潔的功能 - 特別是能夠爲'N'維度的工作原理。但是,我發現'numpy'解決方案在我看來更加整潔! –

+1

不錯。作爲獎勵,它也適用於(如果你小心)與字典。 '[1,2,3],[4,[5],6],[7,8,9,{'a':'b'}]]]和index(lst,[2,3, 'A'])'。 –

相關問題