簡體   English   中英

在For循環中比較列表中的值; 蟒蛇

[英]Comparing Values in List in For Loop; Python

使用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語句進行編碼,以說明所有可能的變化。 顯然,隨着列表數量的增加,這變得非常勞動密集。 必須有一種更簡單的方法,對嗎?

聽起來像您想要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

我認為您想使用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'

要添加其他答案(並完成與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)
    ))
)

我認為這不是一個糟糕的開始。 我將添加一個內部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”方式。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM