使用列表理解来搜索一个二维数组(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)]
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)
这是一个可行的函数,但问题是要特别列表理解。 – MackM 2014-09-26 17:26:12
此功能不正确。它只会返回第一场比赛,而不是所有的比赛。 – CoryKramer 2014-09-26 17:30:49
直到我的帖子发布之后,我才看到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)]
迭代的好反转直接进入元组列表 - 谢谢 - 我学到了一些东西! – 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)]
如果这是一个答案,请提供什么或如何使用。标记为非常低的质量。 – Syfer 2017-06-24 06:16:34
干杯网络,很酷的答案。任何想法为什么: TPOS = [pos for pos,x in numpy.ndenumerate(array)if x ==“T”] does not work? – JMzance 2014-09-26 17:16:19
我甚至不知道'numpy.ndenumerate',这简单得多! – CoryKramer 2014-09-26 17:18:56
是的,它太棒了!不能让它工作。返回空数组 – JMzance 2014-09-26 17:19:42