我试图比较从第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 = 3
和indexB = 3
(匹配' a'),而我希望它返回indexA = 1
和indexB = 1
(匹配在' e')。
任何建议都非常感谢!
答案 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