【问题标题】:Comparing list values (numbers, order matters) in Python在 Python 中比较列表值(数字、顺序很重要)
【发布时间】:2016-12-27 01:06:30
【问题描述】:

我试着到处寻找这个问题的答案,我确信它真的很简单,但不知何故我无法让它工作。

我有两个列表,它们的值数量完全相同,我想知道其中有多少与值和位置完全匹配。这是我一直在使用的代码:

ListA = [1, 2, 3, 4, 5]

solved = 0

While solved == 0:
   rr = 0
   i = 0

   userinput = input("Enter a 5 digit number):")
   ListB = []

   for u in userinput:
        ListB.append(u)

   While i < 5:
        if ListA[i] == ListB[i]:
            rr = rr + 1
   print(rr)
   solved = 1

我正在寻找的输出是,例如,如果输入是 12763, 2,但它似乎从未将 if 评估为 true,因此它永远不会将 1 添加到 rr。 我尝试了一个 for 循环和此设置的变体,但我看不出我错在哪里。

非常感谢您的宝贵时间!

【问题讨论】:

  • While 在 python 中不是一个有效的结构。你的意思是while
  • 在 Python 中,通常直接循环遍历集合中的项目,而不是使用索引间接获取这些项目(如您的 i)。这导致了紧凑、简洁的代码,例如sum(int(c) == u for c, u in zip('12763', [1, 2, 3, 4, 5]))

标签: python list


【解决方案1】:

ListA 包含整数,而ListB 将包含(单个字符)字符串。尝试改用int(ListB[i])

此外,while 内部循环是无限的,因为i 永远不会改变。

【讨论】:

    【解决方案2】:

    你有几个问题:

    1. While 应该是 while
    2. 您从用户收到的输入是一个字符串,因此当您迭代时您应该将其转换为int,因为您想要比较整数。
    3. 您的ivariable 永远不会增加,因此您处于无限循环中。

    试试这个:

    ListA = [1, 2, 3, 4, 5]
    
    solved = 0
    
    while solved == 0:
       rr = 0
       i = 0
    
       userinput = input("Enter a 5 digit number):")
       ListB = []
    
       for u in userinput:
            ListB.append(int(u))
    
       while i < 5:
            if ListA[i] == ListB[i]:
                rr = rr + 1
            i += 1
       print(rr)
       solved = 1
    

    【讨论】:

    • 不能在这里工作:for u in userinput: ListB.append(int(u))
    • 看来 input() 已经知道输入是一个整数。我执行了这个并得到'int object is not interable。我通过将 str() 应用于 input() 来解决此问题,例如:for 循环中的 str(input() 或 userinput,例如:for u in str(userinput().
    • @JoshuaStokes 抱歉,我以为有 5 个数字,但只有 1 个有 5 个数字
    • 嗨@Teshtek,刚刚意识到我的解释器仍然设置为 Python 2.7。哎呀:)
    • @JoshuaStokes,如果你在 Python2.X 上工作,你是对的,但是 Python3 中的 input() 返回一个字符串。
    【解决方案3】:

    input() 函数返回一个字符串。在比较它们之前,您需要将各个数字转换为ints。您还可以使用zip() 比较两个列表中的对应项:

    >>> listA = [1, 2, 3, 4, 5]
    >>> userinput = input("Enter a 5 digit number: ")
    Enter a 5 digit number: 12567
    >>> listB = [int(x) for x in userinput]
    >>> sum(x == y for x, y in zip(listA, listB))
    2
    

    【讨论】:

      【解决方案4】:

      在我看来,你把事情复杂化了。几个列表推导应该可以解决问题:

      ListB = [int(x) for x in userinput]
      rr = sum([ListA[i] == ListB[i] for i in range(len(ListA))])
      

      【讨论】:

      • 这还是有比较字符串和整数的问题。
      • @fuglede 是的,不错的收获!我正在尝试解释器,并复制了错误的行。已编辑和修复。
      【解决方案5】:

      我认为解决方案可能是这样的:

      第一个虽然不是你也永远不会将 i 增加到第二个 while 和 last 如何将副本复制到列表输入中?你使用空间还是如何使用?你怎么知道你有 5 个数字?我想它们是按空间划分的吗?

      ListA = [1, 2, 3, 4, 5]
      
      solved = 0
      
      while solved == 0:
        rr = 0
        i = 0
      
        userinput = input("Enter a 5 digit number: ")
        ListB = [int(x) for x in userinput.split(' ') if x.isdigit()]
      
        while i < 5:
          if ListA[i] == ListB[i]:
            rr += 1
          i += 1
        print(rr)
        solved = 1
      

      如果输入为1 2 3 4 5,则输出5

      更新: 如果输入是 5 位数字,则不必拆分空间,因此请寻找其他用户解决方案

      【讨论】:

      • 用户输入没有空格。请参阅 OP 的 input 提示:Enter a 5 digit number):"
      • 好的,完美!谢谢
      • 看起来好像不是!
      • @teshtek,您应该提供与已经提供的答案不同的答案。
      • 如果存在差异,while 循环永远不会结束,因为在这种情况下 i 不会递增。
      猜你喜欢
      • 2015-08-27
      • 1970-01-01
      • 2016-04-06
      • 2016-06-10
      • 1970-01-01
      • 1970-01-01
      • 2021-03-10
      • 2021-03-12
      • 1970-01-01
      相关资源
      最近更新 更多