我正在研究牛队/公牛队的比赛,我知道这场比赛已经被回答了一千次,但我还没有看到这种特殊的方法出现,我很困惑自己做错了什么。
我试图让一个列表的计数每出现一个存在于两个列表之间但不在同一索引位置的数字就增加1。请参阅下面的示例。
n = [1,2,3,4]
solution = [0,3,1,0]
bulls = 0
cows = 0
for i in solution:
if i != n[0]:
if i in n:
bulls +=1
print (bulls)
我也尝试过用以下方式写这篇文章,但没有成功。
n = [1,2,3,4]
solution = [0,3,1,0]
bulls = [0]
cows = [0]
for i in solution:
if i != n[0] and i in n:
bulls.append(1)
bulls = sum(bulls)
print (bulls)
这两个代码块都返回1,而根据权限,它们应该返回2(列表中匹配的1返回1,匹配的3返回1(。
任何见解都值得赞赏。
这里有一个简单的解决方案。您的一个主要问题是,在循环(bulls = sum(bulls)
(的每次迭代中,您都告诉bulls为1。另一个问题是,当你本应该检查n[currentSolutionIndex]
时,你只检查了n[0]
n = [1,2,3,4]
solution = [0,3,1,0]
bulls = 0
cows = 0
for i, data in enumerate(solution):
if data in n:
if data != n[i]: #if they aren't the same index
bulls += 1
else: #otherwise they are the same index
cows += 1
print(bulls) #2
print(cows) #0
这是我给你的另一个例子,作为向你介绍更多东西的一种方式。这不一定是处理这个问题的好方法,但它向你介绍了更多的概念,这个问题是理解它们的简单方法。使用zip
,我们可以一次迭代2个数组。f1
是farm1
的值,而f2
是farm2
的值。我们还使用了一个列表生成器,这样我们就可以将所有逻辑保持在一行中。
这里有一件重要的事情需要注意~side effects
是糟糕的编码实践。在这种情况下,我们使用列表生成器来解析其中的一个数字,这就是side effect
。我们应该使用列表生成器来获取列表。在这里,我们滥用列表生成器的唯一目的是将其转储到sum
中。简言之,这个例子没有一个是好的,但零碎地使用,它说明了一些方便的概念。
farm1 = [0,2,3,1]
farm2 = [1,2,3,4]
cows = sum([1 for f1, f2 in zip(farm1, farm2) if f1 == f2])
bulls = sum([1 for f1, f2 in zip(farm1, farm2) if f1 != f2 and f1 in farm2])
print(cows) #2
print(bulls) #1