获取包含另一个元素的数组中元素的索引

4

假设我有以下这个数组:

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
可读性在这里非常主观:许多程序员会认为itertools比循环混杂着偶尔的中断更清晰。效率方面:不如使用itertools。 - Alex Yu
9个回答

7

有一个稍微更好的 Pythonic 方法是使用 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

这会如何返回索引呢? - L.D
1
@L.D 是的,那是我的错误。我刚刚修复了它。 - UltraInstinct

2

最好避免使用break。以下是更好的方法:

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

2

一行代码解决方案

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

在生成器表达式上使用 next(..) 可能会给你一个等效于我的答案中的短路,而无需构造整个列表。 - UltraInstinct
是的,我完全忘记了 -)) - marmeladze

1
你所拥有的似乎是正确的方法,但还有一些改进的空间:
def find(item, array):
    counter = 0
    for each in array:
        if item in each:
            return counter
        counter = counter + 1
    return None

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

更新:实际上不需要返回 None - 这是所有函数的默认值

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

1
如果您仍然想使用index方法,这里提供了一种可能的方法:
[x.index(5) for x in array if 5 in x]

不要忘记获取零索引项 -)) - marmeladze

1
作为使用enumerate()的替代方案,我会选择以下代码:
for elem in array:
     for i in elem:
             if 5 in elem: print array.index(elem)
             break

0

真的不需要一个“计数器”变量。我会选择:

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

1
你可能想返回None而不是-1,因为-1也是一个有效的索引。 :) - Hara
1
如果数字5在内部数组的索引0处会怎样? - L.D

0
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

可能有更有效的方法,但这对我来说可行


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

0

我看到了一些功能性的例子,所以我有点晚了:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接