我正在尝试搜索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"]
答案 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)]