使用列表理解来搜索一个二维数组(python)

问题描述:

我想搜索一个二维数组的字符并返回数组中所有字母T的数组索引(x_T,y_T)。我想这可以很容易地用两个堆叠的for循环完成,但我很想知道是否可以使用列表理解来有效地完成。 我已经试过了诸如:使用列表理解来搜索一个二维数组(python)

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"] 

这最终是一个野兽一行,为便于阅读,可能更容易打破它向上。

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)] 
+0

干杯网络,很酷的答案。任何想法为什么: TPOS = [pos for pos,x in numpy.ndenumerate(array)if x ==“T”] does not work? – JMzance 2014-09-26 17:16:19

+0

我甚至不知道'numpy.ndenumerate',这简单得多! – CoryKramer 2014-09-26 17:18:56

+0

是的,它太棒了!不能让它工作。返回空数组 – JMzance 2014-09-26 17:19:42

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) 

+2

这是一个可行的函数,但问题是要特别列表理解。 – MackM 2014-09-26 17:26:12

+0

此功能不正确。它只会返回第一场比赛,而不是所有的比赛。 – CoryKramer 2014-09-26 17:30:49

+0

直到我的帖子发布之后,我才看到Cyber​​的真棒回答。 – Sarah 2014-09-26 17:31:19

不太一样好@网络的答案(即,元组列表而不是元组的名单列表),但使用“香草”列表内涵与枚举(嘿,我很好奇):

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此得到一个元组列表。

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)] 
+0

迭代的好反转直接进入元组列表 - 谢谢 - 我学到了一些东西! – jstevenco 2014-09-28 18:30:19

问的问题基本上是试图实现这种

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)] 
+0

如果这是一个答案,请提供什么或如何使用。标记为非常低的质量。 – Syfer 2017-06-24 06:16:34