使用list comprehension搜索二维数组(python)

时间:2014-09-26 17:07:52

标签: python list-comprehension multidimensional-array

我正在尝试搜索2D字符数组并返回数组中所有字母T的数组索引(x_T,y_T)。我认为这可以通过两个堆叠for循环轻松完成,但我很想知道是否可以使用列表理解有效地完成。 我尝试过这样的事情:

TPos = [[x, y] for x in range(0, len(array[x])) for y in range(0, len(array[x][y])) if array[x][y] == 'T']

但是我遇到了与数组边界有关的错误。有人能指出我正确的方向。干杯, 千斤顶

修改

现在尝试使用'ndenumerate'如下:

TPos = [pos for pos, x in numpy.ndenumerate(array) if x == "T"]

5 个答案:

答案 0 :(得分:3)

这最终成为了一线的野兽,为了便于阅读,可能更容易将其分解。

l = [['a','b','T'],
     ['T','T','g'],
     ['c','T','T']]

reduce(lambda x,y: x+y, [[(x,y) for y in range(len(l[y])) if l[x][y] == 'T'] for x in range(len(l))])

输出

[(0, 2), (1, 0), (1, 1), (2, 1), (2, 2)]

编辑使用numpy,这更加简单。

import numpy as np
[pos for pos, x in np.ndenumerate(np.array(l)) if x == 'T']

输出

[(0, 2), (1, 0), (1, 1), (2, 1), (2, 2)]

答案 1 :(得分:1)

numpy where这样做很简单:

In [16]: l = [['a','b','T'],
   ....:      ['T','T','g'],
   ....:      ['c','T','T']]

In [20]: np.where(np.array(l)=='T')
Out[20]: (array([0, 1, 1, 2, 2]), array([2, 0, 1, 1, 2]))

In [22]: zip(*np.where(np.array(l)=='T'))
Out[22]: [(0, 2), (1, 0), (1, 1), (2, 1), (2, 2)]

没有numpy这里是我的列表理解版本:

In [27]: [(i,j) for i,v in enumerate(l) for j,k in enumerate(v) if k=='T']
Out[27]: [(0, 2), (1, 0), (1, 1), (2, 1), (2, 2)]

答案 2 :(得分:0)

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

def return_indexes(some_list,what_you_want_to_find):
    temp=[]
    for i in range(len(some_list)):
        for j in range(len(a[i])):
            if a[i][j] == what_you_want_to_find:
                temp.append([i,j])
    return temp

print return_indexes(a,7)

def return_indexes(some_list,what_you_want_to_find): temp=[] for i in range(len(some_list)): for j in range(len(a[i])): if a[i][j] == what_you_want_to_find: temp.append([i,j]) return temp print return_indexes(a,7)

答案 3 :(得分:0)

不如@Cyber​​的回答(即元组列表列表而不是元组列表),但使用" vanilla"用枚举列出理解(嘿,我很好奇):

l = [['a','b','T'],['T','T','g'],['c','T','T']]
[[(i,j) for j,col in enumerate(row) if col=='T'] for i,row in enumerate(l)]

输出

[[(0, 2)], [(1, 0), (1, 1)], [(2, 1), (2, 2)]]

当然,您可以将reduce(lambda ...)similar approach应用于此以获取元组列表。

答案 4 :(得分:-1)

提出的问题基本上是试图实现这个目标

array= [['a','b','T'], ['T','T','g'], ['c','T','T']]
TPos = [(x, y) for x in range(len(array)) for y in range(len(array[x])) if array[x][y] == 'T']
TPos

输出

[(0, 2), (1, 0), (1, 1), (2, 1), (2, 2)]