2011-11-03 86 views
1

使用Python 2.7。比較For循環中列表中的值; Python

我有兩個不同的列表,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語句考慮到所有可能的變化:

我第一次嘗試使用。顯然,隨着列表大小的增加,這會非常耗費人力。有一個更簡單的方法,對吧?

回答

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 
+0

完美!非常感謝。 –

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的長度。如果不是這樣,你可能想要做一些額外的檢查。

此外,可能會有更好的,更「蟒蛇」的方式。

+0

沒關係,我更喜歡Jochen Ritzel的回答! :) – Kris

+0

啊。雅,這是有道理的。謝謝。 –

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' 
+0

感謝您的拉鍊提示! –

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 
+1

減去然後比較結果爲0是非pythonic,因爲它忽略了更簡單的'cmp'方法,並且OP顯然希望每次通過循環積累勝利/關係/損失,而不是重新設置它們。 –

+0

啊,你說得對。感謝您指出。 – astevanovic

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 -many times,zip again(to製作三個勝利計數,平局計數和損失計數列表)和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) 
    )) 
)