【问题标题】:Adding/Appending per occurrence in string在字符串中每次出现添加/附加
【发布时间】:2020-10-28 07:12:27
【问题描述】:

我正在开发 Cows/Bulls 游戏,我知道该游戏已被回答一千次,但我还没有看到这种特殊方法出现,我对自己做错了什么感到困惑.

我试图让列表的计数在两个列表之间存在但不在同一索引位置的数字每次出现时增加 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,1 表示匹配的 3)。

感谢任何见解。

【问题讨论】:

    标签: python if-statement append


    【解决方案1】:

    这是一个简单的解决方案。你的主要问题之一是你告诉公牛在循环的每次迭代中都是 1 (bulls = sum(bulls))。另一个问题是你只检查了n[0],而你应该检查n[currentSolutionIndex]

    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 个数组。 f1farm1 值,f2farm2 值。我们还使用了一个列表生成器,因此我们可以将所有逻辑都放在一行中。

    这里有一点需要注意~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
    

    【讨论】:

    • 谢谢,我刚学python,这是我遇到的第一个真正卡住的概念。我不知道 enumerate 函数,这很有帮助。
    • @Brandon Covington - 我很高兴能帮上忙。如果我的回答解决了你的问题,请记得选择它作为解决方案。
    • 你的回答是,我只是标记了它。它也产生了一个新问题,但只是因为必须弄清楚如何在索引位置匹配时追加计数,但这是一个不同的问题。
    • @Brandon Covington - 谢谢,先生。给我1分钟,我在这里回答你的第二个问题。
    • 谢谢你,你刚才向我展示的概念是我一直在努力理解的东西,你把它们放在一种让它们很容易可视化的方式。我将把这个语言如何工作的例子添加到我的运行笔记列表中。我使用了这段代码,它运行良好(更不用说完全手动执行它节省了大约 50 行代码。我真诚地感谢帮助,我将阅读副作用以了解它们是如何工作的以及如何避开他们。
    猜你喜欢
    • 2012-01-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-13
    • 2023-01-19
    • 1970-01-01
    • 2020-02-04
    相关资源
    最近更新 更多