2014-09-26 66 views
2

我想搜索一個二維數組的字符並返回數組中所有字母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"] 

回答

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

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) 

+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

0

不太一樣好@網絡的答案(即,元組列表而不是元組的名單列表),但使用「香草」列表內涵與枚舉(嘿,我很好奇):

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

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

迭代的好反轉直接進入元組列表 - 謝謝 - 我學到了一些東西! – jstevenco 2014-09-28 18:30:19

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

如果這是一個答案,請提供什麼或如何使用。標記爲非常低的質量。 – Syfer 2017-06-24 06:16:34