繁体   English   中英

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

[英]Python: Find indices of the *first* match between two arrays

我想比较起零指数在两个数组,以在第一时间发现在arrayA 任何元素元素arrayB匹配-和相应的每个阵列中的位置。

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

这是我的代码:

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”的匹配)。

任何建议,不胜感激!

问题是一旦找到第一个匹配项,您将继续循环播放。 当你找到一个匹配你需要break跳出循环。 另外,您实际上不需要嵌套循环。

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

您应该使用enumerate其提供各元素的索引与set0(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

让我建议对mattm的回答进行性能改进。 当您在请求对象的索引之前没有检查对象在列表中的存在时,而是在后者失败时处理异常,可以节省一些比较(可能很多)的比较。 注意,在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]

请注意,使用设置的数据结构来有效地找出某个项目是否值得检索其索引,可以节省更多的比较。 这实际上是坎德拉(Padraic Cunningham)所暗示的

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

第一匹配是在索引3 arrayA和索引4 arrayB ,这是在这两种情况下4

您可以将其重构为一个函数(无论如何,都不是一个糟糕的主意),然后使用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的解决方案仅包括第二个“ guard”变量,指示您是否找到了匹配项。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM