获取元素的索引数组包含其他元素

问题描述:

所以可以说我有此数组:获取元素的索引数组包含其他元素

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

,我想获得含5例如内部数组的索引。所以在这种情况下,我想要的返回索引是1.

我确实尝试了ind = array.index(5),但我很清楚为什么这没有用,因为括号中的值必须完全匹配数组中的元素。另一种方式我这样做是

counter = 0 
for each in array: 
    if 5 in each: break 
    else: counter = counter + 1 

,这工作得很好我想要什么,但我想检查是否有这样做的更简单和更清洁的方式。谢谢

+2

这似乎是最有效的/可读的方式给我。 – buckettt

+0

可读性在这里是非常主观的:很多程序员会认为itertools比它们中的短暂休息的混杂更清晰。效率:没有。 Itertools – Ingaz

有一个稍微好一点的Python的方式使用next(..)。请记住,如果任何子阵列中不存在5,则会抛出StopIteration。你可能想要处理它。

>>> your_list = [[1,2,3],[4,5,6],[7,8,9]] 
>>> next(i for i, x in enumerate(your_list) if 5 in x) 
1 
+0

这将如何返回索引? –

+1

@ L.D是的,那是我的错误。我只是修复了它 – SuperSaiyan

真的不需要counter变量。我会去:

for inner_array in array: 
    if inner_array.index(5) > -1: 
    return array.index(inner_array); 
return None; 
+1

您可能想返回None而不是-1;因为-1也是一个有效的索引。 :) – Haranadh

+1

如果5在内部数组的索引0中该怎么办? –

你有什么似乎要走的路,但也有一些改进可能:

def find(item, array): 
    counter = 0 
    for each in array: 
     if item in each: 
      return counter 
     counter = counter + 1 
    return None 

但是,即使可以自动计数器:

更新:其实不需要返回无 - 这是所有功能的默认

def find(item, array): 
    for idx, each in enumerate(array): 
     if item in each: 
      return idx 

更好地避免break s。这里是一个更好的办法:

for ind, inner_arr in enumerate(array): 
    if 5 in inner_arr: 
     return ind 

array = [[1,2,3],[4,5,6],[7,8,9]] 
counter = 0 

for item in array: 
    for n in item: 
     if n == 5: 
      counter += 1 
    print counter 

也许更有效的方式来做到这一点,但是这对我的作品

+0

我想你把counter + = 1放在错误的for循环中。如果数组是array = [[1,2,3],[7,8,9],[4,5,6]] ..你的代码给出的索引仍然是1 –

一个班轮解决方案

#a = [[1,2,3],[4,5,6],[7,8,9]] 
[i for i, j in enumerate(a) if 5 in j][0] 
+0

在发生器表达式上使用'next(..)'可能会给你一个短路,就像在我的回答中一样,而不必构造整个列表 – SuperSaiyan

+0

是的,我已经完全忘记了它 - )) – marmeladze

如果你还是想用index方法,这里是一个可能的方法:

[x.index(5) for x in array if 5 in x] 
+0

不要忘记得到第零件 - )) – marmeladze

我看功能的例子,所以我有点晚:

[(id,inner.index(5)) for id,inner 
in enumerate(arr) 
if 5 in inner] 

作为替代使用enumerate(),我会用下面的代码去:

for elem in array: 
    for i in elem: 
      if 5 in elem: print array.index(elem) 
      break