2017-10-20 81 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'])'。 –

相关问题