Python:查找两个数组之间* first *匹配的索引

时间:2015-03-09 17:27:02

标签: python arrays for-loop

我试图比较从第0个索引开始的两个数组,以找到第一次在arrayA中的任何元素匹配arrayB中的任何元素 - 以及相应的位置在每个阵列中。

问题是,我编写的代码与匹配元素的 last 实例相匹配 - 我不太清楚为什么。

这是我的代码:

for a in arrayA:
     for b in arrayB:
          if a == b:
              indexA = arrayA.index(a)
              indexB = arrayB.index(b)

arrayA = ['j', 'e', 'b', 'a']arrayB = ['k', 'e', 'b', 'a']。代码返回indexA = 3indexB = 3(匹配' a'),而我希望它返回indexA = 1indexB = 1(匹配在' e')。

任何建议都非常感谢!

4 个答案:

答案 0 :(得分:2)

问题是,一旦找到第一场比赛,你就会继续循环。当您找到匹配项时,您需要break退出循环。此外,您实际上并不需要嵌套循环。

for a in arrayA:
    if a in arrayB:
        indexA = arrayA.index(a)
        indexB = arrayB.index(a)
        break

答案 1 :(得分:1)

您应该使用enumerate为每个元素的索引提供set 0(1)次查找,找到时只有break,每个if a in arr_b是一个0(n) 0(1)查找而不是集合的st = set(arr_b) for ind, a in enumerate(arr_a): if a in st: index_a = ind index_b = arr_b.index(a) break ,大数据的效率会更高:

{{1}}

答案 2 :(得分:0)

让我建议改善mattm's answer的表现。如果在请求索引之前不检查列表中对象的存在,而是在后者失败时处理异常,则可以节省一些(可能很多)比较。 N.B.,在Python中,更容易要求宽恕而不是许可。

arrayA = [1,2,3,4,5,6,7,8]
arrayB = [8,7,6,5,4]

# assign default, just in case no match is found
indexB = None
for indexA, a in enumerate(arrayA):
    try:
        indexB = arrayB.index(a)
        break
    except ValueError:
        # item is not in list, continue search
        continue

print indexA, indexB, arrayA[indexA], arrayB[indexB]

请注意,使用set数据结构可以有效地找出项目是否值得检索索引,可以节省更多的比较。这实际上是Padraic Cunningham suggests

arrayA = [1,2,3,4,5,6,7,8]
arrayB = [8,7,6,5,4]

# assign default, just in case no match is found
indexB = None
setB = set(arrayB)
for indexA, a in enumerate(arrayA):
    if a in setB:
        indexB = arrayB.index(a)
        break

print indexA, indexB, arrayA[indexA], arrayB[indexB]

预期的输出在两种情况下都是:

$ python test.py
3 4 4 4

第一场比赛是arrayA中的索引3和arrayB中的索引4,两种情况都是4

答案 3 :(得分:-1)

你可以将它重构成一个函数(不管是不是一个糟糕的想法),然后使用return来同时中断两个循环。

def firstMatch(arrayA, arrayB): for a in arrayA: for b in arrayB: if a == b: indexA = arrayA.index(a) indexB = arrayB.index(b) return (indexA, indexB)

或者,您可以将一个例外作为一个穷人的转到。 Python倾向于更容忍异常 - 流量控制,但我不喜欢这个想法。

有一个巧妙的技巧,你也可以使用“不匹配的”if-else子句:

for a in arrayA: for b in arrayB: if a == b: indexA = arrayA.index(a) indexB = arrayB.index(b) break else: # NOT in-line with the if continue; break #in-line with the else.

最后,类似C的解决方案只是包含第二个“保护”变量,指示您是否找到了匹配项。

found = false; for a in arrayA: for b in arrayB: if a == b: indexA = arrayA.index(a) indexB = arrayB.index(b) found = true break if found: break