【问题标题】:Comparing Values in List in For Loop; Python在 For 循环中比较 List 中的值; Python
【发布时间】:2011-12-20 19:33:28
【问题描述】:

在 Python 2.7 中工作。

我有两个不同的列表,A 和 B(简化以使解释更清楚)。

A = [1, 2, 4, 3, 5]
B = [2, 0, 3, 2, 1]

我希望能够比较每个列表 ex- A[1] v B[1]- 的位置值,并将 A 较大的实例(A“获胜”)加起来,当两个值相同(A“平局”),以及 B 较大时的实例(A“损失”)。

为了让事情变得更复杂一点,我还使用 random.shuffle() 每次通过 for 循环随机化列表的顺序。

我第一次尝试使用:

def listComp(listA, listB):
    Awins = 0
    Aties = 0
    Alosses = 0
    for i in range(0, whatever):
        random.shuffle(listA)
        random.shuffle(listB)
        if A[0] > B[0]:
            Awins += 1
        elif A[0] == B[0]:
            Aties += 1
        elif A[0] < B[0}:
            Alosses += 1

然后在每个 if 语句中,编写额外的 if 语句来解释所有可能的变化。显然,随着列表大小的增加,这会变得非常耗费人力。一定有更简单的方法吧?

【问题讨论】:

    标签: python list loops random if-statement


    【解决方案1】:

    要添加到其他答案(并完成与 digivampire 尝试相同的简化),您可以使用免费函数 cmp 来简化比较逻辑。它返回 -1、0 或 1,具体取决于两个值中的哪一个更大。然后我们可以count每个值的出现次数。

    for i in range(0, whatever):
        random.shuffle(listA)
        random.shuffle(listB)
        results = [cmp(a, b) for a, b in zip(listA, listB)]
        Awins += results.count(1)
        Aties += results.count(0)
        Alosses += results.count(-1)
    

    为了进一步使用这种方法,我们可以让 Python 为我们做外循环逻辑和求和。这个想法是用计数结果构建长度为 3 的列表(使用列表推导迭代 -1..1 范围),然后使用另一个列表推导来获得这些结果whatever-很多次,zip他们再次(制作三个列表,分别列出获胜次数、平局次数和失败次数)和sum 每个列表。

    def trial(listA, listB):
        random.shuffle(listA)
        random.shuffle(listB)
        results = [cmp(a, b) for a, b in zip(listA, listB)]
        return [results.count(i) for i in range(-1, 2)]
    
    
    Awins, Aties, Alosses = (
        sum(counts)
        for counts in zip(*(
            trial(listA, listB) for i in range(0, whatever)
        ))
    )
    

    【讨论】:

      【解决方案2】:
      for i in range(0, whatever):
          random.shuffle(listA)
          random.shuffle(listB)
          diffList = map(lambda (x,y): x-y, zip(listA,listB))
          Awins_ties = sum((k > 0, k==0) for k in diffList)
          Awins = Awins_ties[0]
          Aties = Awins_ties[1]
          Alosses = len(diffList) - Awins - Aties
      

      【讨论】:

      • 减去然后将结果与 0 进行比较是非 Pythonic 的,因为它错过了更简单的 cmp 方法,并且 OP 显然希望每次通过循环累积胜利/平局/损失,而不是重新- 设置它们。
      【解决方案3】:

      我想你想要zip,也不确定你为什么要在循环中洗牌(再说一次,我不确定你在这里完成了什么)。我会把它移到外面,因为你仍然会得到随机效果。

      def listComp(listA, listB):
          wins = 0
          ties = 0
          losses = 0
      
          shuffle(listA)
          shuffle(listB)
      
          for a, b in zip(listA, listB):
              if a < b:
                  wins += 1
              elif a == b:
                  ties += 1
              else:
                  losses += 1
      
          return wins, ties, losses
      

      关于zip 的注释,它会给你一个项目列表,只要你给出的最短列表。示例:

      zip([1, 2], ['a', 'b', 'c'])
      

      将输出:

      [(1, 'a'), (2, 'b')]   # Note the missing 'c'
      

      【讨论】:

        【解决方案4】:

        我不认为这是一个糟糕的开始。我会添加一个内部 for 循环来帮助进行硬编码:

        def listComp(listA, listB):
                Awins = 0
                Aties = 0
                Alosses = 0
                for i in range(0, whatever):
                    random.shuffle(listA)
                    random.shuffle(listB)
                    for j in range(0, len(listA)):
                        if A[j] > B[j]:
                            Awins += 1
                        elif A[j] == B[j]:
                            Aties += 1
                        elif A[j] < B[j]:
                            Alosses += 1
        

        此代码示例假定 listA 的长度与 listB 的长度相同。如果这不是真的,您可能需要做一些额外的检查。

        此外,可能还有更好、更“python-y”的方式。

        【讨论】:

        • 啊。是的,这是有道理的。谢谢。
        【解决方案5】:

        听起来你想要zip

        def compare(A,B):
            Awins = 0
            Aties = 0
            Alosses = 0
            for i in range(0, whatever):
                random.shuffle(listA)
                random.shuffle(listB)
                for a,b in zip(A,B):
                    if a > b:
                        Awins += 1
                    elif a == b:
                        Aties += 1
                    else:
                        Alosses += 1
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-09-17
          • 1970-01-01
          相关资源
          最近更新 更多