比较For循环中列表中的值;蟒蛇

时间:2011-11-03 01:13:10

标签: python list loops random if-statement

使用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语句以说明所有可能的变化。显然,随着列表大小的增加,这会非常耗费人力。必须有一个更简单的方法,对吗?

5 个答案:

答案 0 :(得分:4)

听起来像你想要的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

答案 1 :(得分:2)

我认为你想要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'

答案 2 :(得分:2)

要添加其他答案(并完成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 - 很多次,{ {1}}他们再次(制作三个胜利计数,平局计数和损失计数列表)和zip每个列表。

sum

答案 3 :(得分:1)

我认为这不是一个糟糕的开始。我会添加一个内部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”的方式。

答案 4 :(得分:0)

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